精华内容
下载资源
问答
  • hive数据权限管理

    千次阅读 2017-02-27 14:35:19
    hive数据权限管理:权限说明、开启权限管理、权限配置、超级权限。 hive能对数据文件的权限控制,未能控制元数据权限,考虑引入Apache Sentry组件。

    hive数据权限管理

    1.权限说明

    Hive基于元数据库来管理多用户并控制权限。数据分为元数据和数据文件两部分,元数据存储在mysql,而数据文件则是HDFS,控制元数据即控制可访问的数据文件。从mysql存储的Hive元数据表数据字典(metastore数据库)看,Hive是基于元数据mysql管理多用户权限,用户权限信息都存储在元数据表中。要重点理解是,mysql只是保存Hive的元数据,mysql本身的用户和Hive没有关系,Hive只是把自己的用户信息保存在mysql元数据表中。hive能对数据文件的权限控制,未能控制元数据权限,考虑引入Apache Sentry组件。

    眼下hive支持简单的权限管理,默认情况下是不开启。这样全部的用户都具有同样的权限,同一时候也是超级管理员,对hive中的全部表都有查看和修改的权利,这样是不符合一般数据仓库的安全原则的。但是Hive的权限控制并不是完全安全的。基本的授权方案的目的是防止用户不小心做了不合适的事情。

    Hive授权的核心就是用户、组、角色。
    Hive中的角色和平常我们认知的角色是有区别的。Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。

    用户
    张三 G_db1
    李四 G_db2
    王五 G_bothdb

    如上有三个用户分别属于G_db1、G_db2、G_alldb。
    G_db1、G_db2、G_ bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。
    这样只要将role_eb 1赋给G_db1(或者该组的用户),将role_eb2赋给G_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予G_bothdb,则G_bothdb中的用户可以访问两个数据库。

    使用和组使用的是Linux机器上的用户和组,而角色必须自己创建。

    2.开启权限管理

    1.在hive-site.xml文件中配置参数开启权限认证,开启启身份认证后,任何用户必须被grant privilege才能对实体进行操作:
    hive.security.authorization.enabled = true
    
    2.表示创建表时自动赋予一些用户或角色相应的权限:
    hive.security.authorization.createtable.owner.grants = ALL
    hive.security.authorization.createtable.role.grants = admin_role:ALL
    hive.security.authorization.createtable.user.grants = user1,user2:select;user3:create
    
    3.假如出现以下错误: Error while compiling statement: FAILED: SemanticException The current builtin authorization in Hive is incomplete and disabled. 需要配置下面的属性:
    hive.security.authorization.task.factory = org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl
    
    4.属性赋值采用xml,格式如下:
    <property> 
        <name>key</name> 
        <value>value</value> 
    </property> 

    3.权限配置

    --创建和删除角色  
    create role role_name;  
    drop role role_name;  
    --展示所有roles  
    show roles;
    --赋予角色权限  
    grant select on database db_name to role role_name;    
    grant select on [table] t_name to role role_name;    
    --查看角色权限  
    show grant role role_name on database db_name;   
    show grant role role_name on [table] t_name;   
    --角色赋予用户  
    grant role role_name to user user_name; 
    --回收角色权限  
    revoke select on database db_name from role role_name;  
    revoke select on [table] t_name from role role_name;  
    --查看某个用户所有角色  
    show role grant user user_name;

    HIVE支持以下权限:

    权限名称 含义
    ALL 所有权限
    ALTER 允许修改元数据(modify metadata data of object)—表信息数据
    UPDATE 允许修改物理数据(modify physical data of object)—实际数据
    CREATE 允许进行Create操作
    DROP 允许进行DROP操作
    INDEX 允许建索引(目前还没有实现)
    LOCK 当出现并发的使用允许用户进行LOCK和UNLOCK操作
    SELECT 允许用户进行SELECT操作
    SHOW_DATABASE 允许用户查看可用的数据库

    主要元数据表:

    内容
    Db_privs 记录了User/Role在DB上的权限
    Tbl_privs 记录了User/Role在table上的权限
    Tbl_col_privs 记录了User/Role在table column上的权限
    Roles 记录了所有创建的role
    Role_map 记录了User与Role的对应关系

    4.超级权限

    Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员“,必须在hive-site.xml添加配置hive.semantic.analyzer.hook = com.mycompany.AuthHook参数hive.aux.jars.path(目前仅支持本地路径) =file:///usr/lib/hive/lib/HiveAuthHook.jar(此配置仅对hive server有效),并实现自己的权限控制类。

    权限控制类:

    package com.newland;
    
    import org.apache.hadoop.hive.ql.parse.ASTNode;
    import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
    import org.apache.hadoop.hive.ql.parse.HiveParser;
    import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
    import org.apache.hadoop.hive.ql.parse.SemanticException;
    import org.apache.hadoop.hive.ql.session.SessionState;
    
    public class AuthHook extends AbstractSemanticAnalyzerHook {
        private static String[] admin = { "root", "hadoop" };
    
        @Override
        public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
                ASTNode ast) throws SemanticException {
            switch (ast.getToken().getType()) {
            case HiveParser.TOK_CREATEDATABASE:
            case HiveParser.TOK_DROPDATABASE:
            case HiveParser.TOK_CREATEROLE:
            case HiveParser.TOK_DROPROLE:
            case HiveParser.TOK_GRANT:
            case HiveParser.TOK_REVOKE:
            case HiveParser.TOK_GRANT_ROLE:
            case HiveParser.TOK_REVOKE_ROLE:
                String userName = null;
                if (SessionState.get() != null
                        && SessionState.get().getAuthenticator() != null) {
                    userName = SessionState.get().getAuthenticator().getUserName();
                }
                if (!admin[0].equalsIgnoreCase(userName)
                        && !admin[1].equalsIgnoreCase(userName)) {
                    throw new SemanticException(userName
                            + " can't use ADMIN options, except " + admin[0] + ","
                            + admin[1] + ".");
                }
                break;
            default:
                break;
            }
            return ast;
        }
    
    //    public static void main(String[] args) throws SemanticException {
    //        String[] admin = { "admin", "root" };
    //        String userName = "root";
    //        for (String tmp : admin) {
    //            System.out.println(tmp);
    //            if (!tmp.equalsIgnoreCase(userName)) {
    //                throw new SemanticException(userName
    //                        + " can't use ADMIN options, except " + admin[0] + ","
    //                        + admin[1] + ".");
    //            }
    //        }
    //    }
    }

    编译上面代码(需要导入依赖antlr-runtime-3.4.jar,hive-exec-0.12.0-cdh5.1.2.jar)
    打包成jar放置在hive的classpath下(客户端hive shell所在主机的hive-env.sh 中的环境变量:HIVE_AUX_JARS_PATH指向的路径,此配置仅对hive shell生效),最后重启hiveserver。

    参考文献

    1. Hive权限控制和超级管理员的实现
    2. Hive用户权限管理理解
    3. Hive 权限控制
    展开全文
  • 通用数据权限管理系统设计

    千次阅读 2018-03-08 15:33:38
    通用数据权限管理系统设计(一) 作者:逸云 前言: 本文提供一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是RBAC(基于角色的访问控制方法)的进一步扩展和延伸,即...
    通用数据权限管理系统设计(一)
     
    作者:逸云
     
    前言:
     本文提供一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是RBAC(基于角色的访问控制方法)的进一步扩展和延伸,即在功能权限的基础上增加数据权限的管理,实现数据权限和功能权限的集中处理。
     
    解释:
     功能权限:能做什么的问题,如增加销售订单;
     数据权限:能在哪里干什么的问题,如察看北京分公司海淀销售部张三的销售订单;
     
    术语:
     资源:系统中的资源,主要是各种业务对象,如销售单、付款单等;
     操作类型:对资源可能的访问方法,如增加、删除、修改等;
     功能:对资源的操作,是资源与操作类型的二元组,如增加销售单、修改销售单等;
     数据类型:业务系统中常用的数据权限类型,如公司、部门、项目、个人等;
     数据对象:具体的业务对象,如甲公司、乙部门等等,包括所有涉及到数据权限的对象值;
     权限:角色可使用的功能,分角色的功能权限和角色的数据权限;
     角色:特定权限的集合;
     用户:参与系统活动的主体,如人,系统等。
     
     
    通用数据权限管理系统设计(二)
     
    方法说明:
     在实际应用中,数据权限的控制点一般相对固定,如针对公司、部门、个人、客户、供应商等,也就是说数据权限一般针对指定数据类型下的一些数据对象。
     
     本方法中,数据权限的依赖于功能权限,是对功能权限的进一步描述,说明角色在指定的功能点上的数据控制权限。
    本方法中采用“没有明确规定即视为有效”的原则,如果没有定义功能的数据权限,则说明该角色具有该功能的全部的权限。如果定义了功能的某种类型的数据权限,则该用户只具有该类型下指定数据的数据权限。
     
     这段话比较绕口,下面举个例子实际例子。
     
     某公司有北京销售部、上海销售部和广州销售部三个销售部,现在需要定义几种角色:
        销售总监      -- 能察看所有销售部的销售订单;
        北京销售经理 -- 只能察看北京销售部的所有销售订单;
        上海销售经理 -- 只能察看上海销售部的所有销售订单;  
        广州销售经理 -- 只能察看广州销售部的所有销售订单;  
     
     上述角色的定义如下:
     
         -------------------------------------------------------------------
         角色名称             功能             数据类型     数据对象  
         -------------------------------------------------------------------
         销售总监           察看销售订单                                 
         北京销售经理       察看销售订单         部门         北京  
         上海销售经理       察看销售订单         部门         上海     
         广州销售经理       察看销售订单         部门         广州     
         -------------------------------------------------------------------
     
        上述定义中,销售总监只定义了功能权限,而没有定义数据权限,所以销售总监能够察看所有的销售订单;而其他几位销售经理分别定义了这一功能的数据权限,所以只能察看指定部门的销售订单。
     
         在实际应用中,往往会出现部门分组,组长能够察看本组所有人员处理的销售订单的情况,以及某些情况下,某些人只能察看本人的销售订单的情况,这些特殊情况在上述的说明中无法解决,需要在设计和实现中进行处理。
     
     
        北京销售代表 -- 只能察看北京销售部的本人的所有销售订单;  
         北京销售代表         察看销售订单           部门            北京     
                                                     个人                  
     
     
    通用数据权限管理系统设计(三)--数据库设计
     
    我们先来看看传统的基于角色的权限管理系统,如下图所示,最简单的基于角色的权限管理由系统功能、系统角色、系统用户、角色功能和用户角色五部分组成。
        图一:基于角色的数据库结构
    为实现数据权限控制,在设计上对基于角色的权限管理进行扩充,如下图所示:
     
    图二:通用数据权限管理系统数据库设计
    对比两张图,我们可以看到,他们之间的主要变化为:
    1、 增加系统资源信息和操作类型信息,系统资源为树形结构、如销售模块、销售订单等;操作类型记录可能的操作,如增加、删除、修改、查看、查询等,系统功能是资源与操作类型的组合,对资源的操作就是系统功能。
    2、 增加数据对象类型和数据对象两张表,数据对象类型记录系统中需要控制的对象类型,如部门、库房、员工、客户、供应商等;数据对象记录各对象类型的对象实例,如北京销售部、上海销售部、张三、李四等等。(独立保存的好处后面会说到)
    3、 增加系统资源与数据对象类型的关联表(多对多),本表为配置表,说明某种资源可能需要的控制点,如销售订单与部门类型的关联可能涉及到分部门分配权限;销售订单与客户的关联可能涉及到按客户分配权限等等。
    4、 增加数据对象与角色权限的关联,这张表是真正最终实现数据权限管理的所在地。
     
    通过这种设计,能够最小化地减少对原有权限系统的更改,并且可以很灵活地增加数据的控制点。在产品化软件的设计中使用,能够灵活满足客户的需要。
     
    下一篇文章将讨论这种结构如何满足第二部分功能需求的问题,如果时间允许,将对程序的设计做进一步阐述。
     
    本设计方法已应用于自行开发的通用供应链管理系统中,欢迎指正。
    展开全文
  • 功能权限和数据权限管理的实现

    万次阅读 2018-01-10 11:36:19
    功能权限和数据权限管理的实现 转自 http://blog.csdn.net/xuanbg/article/details/23286717 标签:企业 /权限 1 引言 权限,可分为“功能(操作)权限”和数据权限两种,在系统中,两种...

    功能权限和数据权限管理的实现

    转自 http://blog.csdn.net/xuanbg/article/details/23286717

    1      引言

    权限,可分为“功能(操作)权限”和数据权限两种,在系统中,两种权限应当同时有效。例如,在windows系统中,某用户具有新建一个文件的功能权限,该用户在C盘没有写权限,但在D盘有写权限;则该用户不能把他创建的文件保存在C盘而只能保存在D盘。

    在上述例子中,能否创建文件是由功能权限来控制的,能否保存文件是由数据权限进行控制的。只有两者同时有效,用户的业务才能顺利进行。

    简单地说,权限管理就是对资源的管理。权限管理的目的就是建立分配资源的规则,以便用户能够通过这套规则,获取他们应该获得的资源。

    1.1     定义

    ² 功能权限:

    也叫操作权限,指的是允许拒绝用户使用系统提供的某个功能。

    ² 数据权限:

    指的是允许拒绝用户进行某个数据的增删改查操作。

    ² 授权:

    指的是分配具体的权限给具体的人。

    ² 鉴权:

    指的是对具体人的行为,根据权限规则进行合法性鉴别。

    1.2     授权的基本原则

    对于授权来说,需要定义的有且只有权限和授权对象两个要素。简而述之,对于功能操作就是“什么功能授权给哪个用户来操作”。同样,对于数据,就是“什么数据授权给哪个用户来操作”

    一般情况下,我们并不会对单一的功能/数据进行单用户的授权管理,因为这样用户操作起来显然非常麻烦。为了方便和简化操作,一般的授权规则是:

    哪些功能/数据授权给哪些用户

    1.3     授权的一般方法

    在实际的授权管理中,我们总是根据业务的需求,将一些在业务上不可分割的、需要允许用户一起使用的功能,组合成一个权限集合进行统一授权。对于这样的权限集合,我们一般称之为“角色”。也就是说,我们通过角色来定义用户被允许使用哪些功能和访问哪些数据。当然,我们一般把功能和数据分开来进行授权,以便获得更加灵活的权限规则配置方法,以适应更广泛的授权需求。

    由于某些不同用户在该业务上需要具有相同的权限,那么这些不同的用户在特定的业务上就具有了共性,可以作为一个抽象的用户来进行权限的授予。授权管理使用的抽象的用户,也就是用户集合,除了普遍使用的“用户组”外,还可以引用别的业务中所使用的对象。例如组织机构管理中的“机构/部门”、“职位”和工作流中使用的“岗位”等,在授权管理中都是作为用户集合使用,本质毫无二致。

    通过让抽象的用户扮演角色,即可使这个抽象的用户所代表的真实用户获得完成业务所需的权限。通过这样的方式,可以简化授权管理,方便用户操作。

    2      授权管理

    将特定的权限授予特定的人群的过程,我们称之为“授权”。为了能够方便地进行授权操作,我们必须要有一个能够提供合理授权方法的用户界面。

    2.1    功能权限的授权

    对于一个可扩展的系统来说,意味着功能是不断变化的。为了适应这种不能事先确定的变化,必须将功能权限进行分散管理。分散管理的好处如下:

    ²  天然地支持业务的动态变化,系统实现简单。

    ²  权限的调整范围可控制在局部范围,方便权限的管理和操作。

    2.1.1   一般权限的授予

    功能权限是单维度的,可以通过简单的在功能列表或功能树上进行勾选来确定一个“角色”所允许的功能操作。然后,让相应用户成为该“角色”的“扮演者”。这样就可以把该角色所允许的功能操作授权给指定的用户了。

    如果需要有更多的不同角色,那么新建角色,勾选不同的被允许的功能操作,并分别让相应的用户成为新角色的成员即可。

    2.1.2   例外权限的授予

    如果某个特定用户张三需要额外的一个权限,那么新建一个允许该功能操作的角色,并让张三成为该角色成员即可使张三拥有额外的权限。

    如果某个特定用户李四需要比同一项目组的其他人少一个权限,那么新建一个拒绝该功能操作的角色,并让李四成为该角色成员即可使李四不能进行该项操作。因为在鉴权过程中,拒绝的优先级要高于允许。

    2.2    数据权限的授权

    数据在系统中共同的特性有如下维度:

    ²  业务维度:不同的业务产生不同的数据

    ²  生产者维度:相同的业务会有多个数据生产者和生产部门

    有些业务需要用户访问其他业务的数据,或者是其他数据生产者中特定生产者的生产的数据。简单的说,就是数据权限的授予必须支持跨业务和跨部门。

    2.2.1   一般权限的授予

    由于数据的特殊性质,实际上在有限范围内的授权比功能权限的授予更加方便。因为生产部门和生产者具有天然的分类属性,所以象“本机构”、“本部门”、“本人”这些对生产者维度的进一步抽象就有了用武之地。

    在不对业务维度做限定的情况下,就可以配置例如“允许本部门的成员管理(增删改查)本部门的数据”这样的权限规则。那么对于不同部门的用户,这条共同的规则所产生的效果并不相同,具体的效果是与用户所在的部门的业务和产生的数据相对应的。

    根据以上分析,我们可以内置一些抽象规则,例如:

    ²  允许管理本机构(含下级机构/部门)的数据

    ²  允许管理本部门(含下级部门)的数据

    ²  仅允许管理本部门的数据

    ²  仅允许管理本人的数据

    ²  允许查看本机构(含下级机构/部门)的数据

    ²  允许查看本部门(含下级部门)的数据

    ²  仅允许查看本部门的数据

    ²  仅允许查看本人的数据

    2.2.2   自定义权限的授予

    一般数据权限的授予只能局限于符合高度抽象规则所限定的范围。如果要在这个范围之外的数据进行授权,例如想让财务部的人访问采购部的数据,显然是一般数据授权所不能支持的。

    这个时候,我们就必须要提供用户在角色中自由定义允许或禁止用户访问的数据集的方法。上面说过,一个数据需要在业务和生产者两个维度上进行描述,才能确定数据。那么在定义角色所允许访问的数据集时,因为授权分散在不同的业务中,所以业务是确定的,剩下的就是需要指定一个或多个生产者。在这里,生产者可以使用抽象方法进行归纳分类。

    最后,类同于功能权限的授权方式,我们把定义好的角色分配给一个抽象的用户即可将一个自定义的数据权限授予抽象用户代表的真实用户。

    3      权限管理的实现

    权限管理的具体实现方法,离不开数据结构的支持。相对来说,有具体的数据结构,我们也更容易理解权限的管理机制。在讨论权限之前,我们还需要先了解权限管理的对象:功能资源和数据资源。这些资源同样需要一个数据结构去进行定义。

    3.1    组织机构和用户

    组织机构表:

    1. CREATE TABLE Sys_Organization(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_Organization UNIQUE CLUSTERED IDENTITY(1,1),                               --自增序列  
    4. [ParentId]         VARCHAR(36),                                                                                        --父节点ID  
    5. [NodeType]         INT NOT NULL,                                                                                       --节点类型:1、机构;2、部门;3、职位  
    6. [Index]            INT,                                                                                                --序号  
    7. [Code]             VARCHAR(32),                                                                                        --编码  
    8. [Name]             NVARCHAR(32) NOT NULL,                                                                              --名称  
    9. [Alias]            NVARCHAR(16),                                                                                       --别名/简称  
    10. [FullName]         NVARCHAR(32),                                                                                       --全称  
    11. [PostId]           VARCHAR(36),                                                                                        --岗位ID,字典  
    12. [Validity]         BIT DEFAULT 0 NOT NULL,                                                                             --是否有效:0、无效;1、有效  
    13. [CreatorUserId]    VARCHAR(36),                                                                                        --创建人ID  
    14. [CreateTime]       DATETIME DEFAULT GETDATE() NOT NULL                                                                 --创建时间  
    15. )  
    16. GO  

    用户表: 

    1. CREATE TABLE Sys_User(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED,                                                               --此ID与主数据ID相同  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_User UNIQUE CLUSTERED IDENTITY(1,1),                                       --自增序列  
    4. [Name]             NVARCHAR(16) NOT NULL,                                                                              --用户名  
    5. [LoginName]        VARCHAR(36) NOT NULL,                                                                               --登录名  
    6. [Password]         VARCHAR(32) DEFAULT 'e10adc3949ba59abbe56e057f20f883e' NOT NULL,                                    --登录密码,保存密码的MD5值,初始密码123456  
    7. [Description]      NVARCHAR(MAX),                                                                                      --描述  
    8. [BuiltIn]          BIT DEFAULT 0 NOT NULL,                                                                             --是否预置:0、自定;1、预置  
    9. [Validity]         BIT DEFAULT 0 NOT NULL,                                                                             --是否有效:0、无效;1、有效  
    10. [CreatorUserId]    VARCHAR(36),                                                                                        --创建人ID  
    11. [CreateTime]       DATETIME DEFAULT GETDATE() NOT NULL                                                                 --创建时间  
    12. )  
    13. GO  

    3.2    资源

    3.2.1   模块和功能

    模块表: 

    1. CREATE TABLE Sys_Module(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_Module UNIQUE CLUSTERED IDENTITY(1,1),                                     --自增序列  
    4. [ParentId]         VARCHAR(36),                                                                                        --父模块ID  
    5. [Level]            INT NOT NULL,                                                                                       --模块级别:0、主窗体模块;1、普通业务模块;2、业务子模块  
    6. [Name]             NVARCHAR(64) NOT NULL,                                                                              --名称  
    7. [Location]         VARCHAR(MAXNOT NULL,                                                                              --文件安装路径  
    8. [DataTable]        NVARCHAR(64),                                                                                       --模块主数据表名称  
    9. [Description]      NVARCHAR(MAX),                                                                                      --描述  
    10. [RegisterTime]     DATETIME DEFAULT GETDATE() NOT NULL                                                                 --模块注册时间  
    11. )  
    12. GO  

    模块功能表:
    1. CREATE TABLE Sys_ModuleAction(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_ModuleAction UNIQUE CLUSTERED IDENTITY(1,1),                               --自增序列  
    4. [ModuleId]         VARCHAR(36) FOREIGN KEY REFERENCES Sys_Module(ID) ON DELETE CASCADE NOT NULL,                       --模块注册ID  
    5. [Name]             NVARCHAR(64) NOT NULL,                                                                              --名称  
    6. [SubModuleId]      VARCHAR(36) FOREIGN KEY REFERENCES Sys_Module(ID),                                                  --子模块ID(功能作为子模块入口时)  
    7. [Description]      NVARCHAR(MAX)                                                                                       --描述  
    8. )  
    9. GO  

    3.2.2   业务数据

    物资数据表: 

    1. CREATE TABLE MDG_Material(  
    2. [MID]              VARCHAR(36) PRIMARY KEY NONCLUSTERED FOREIGN KEY REFERENCES MasterData(ID) ON DELETE CASCADE,       --主数据索引ID  
    3. [SN]               BIGINT CONSTRAINT IX_MDG_Material UNIQUE CLUSTERED IDENTITY(1,1),                                   --自增序列  
    4. [Index]            INT,                                                                                                --序号  
    5. [BarCode]          VARCHAR(16),                                                                                        --条形码  
    6. [Brand]            NVARCHAR(16),                                                                                       --品牌  
    7. [Model]            NVARCHAR(32),                                                                                       --型号  
    8. [Size]             DECIMAL(20,6),                                                                                      --规格  
    9. [SizeType]         VARCHAR(36) FOREIGN KEY REFERENCES MasterData(ID),                                                  --规格单位ID,字典  
    10. [Color]            NVARCHAR(8),                                                                                        --颜色  
    11. [Material]         NVARCHAR(8),                                                                                        --材质  
    12. [StorageType]      VARCHAR(36) FOREIGN KEY REFERENCES MasterData(ID),                                                  --存储方式ID,字典  
    13. [Description]      NVARCHAR(MAX),                                                                                      --描述  
    14. [Enable]           BIT DEFAULT 1 NOT NULL,                                                                             --是否可用:0、不可用;1、可用  
    15. [CreatorDeptId]    VARCHAR(36) FOREIGN KEY REFERENCES Sys_Organization(ID),                                            --创建部门ID  
    16. [CreatorUserId]    VARCHAR(36) FOREIGN KEY REFERENCES Sys_User(ID) NOT NULL,                                           --创建人ID  
    17. [CreateTime]       DATETIME DEFAULT GETDATE() NOT NULL                                                                 --创建时间  
    18. )  
    19. GO  

    3.3    RBAC模型

    3.3.1   角色

    角色表: 

    1. CREATE TABLE Sys_Role(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_Role UNIQUE CLUSTERED IDENTITY(1,1),                                       --自增序列  
    4. [Name]             NVARCHAR(64) NOT NULL,                                                                              --名称  
    5. [Description]      NVARCHAR(MAX),                                                                                      --描述  
    6. [BuiltIn]          BIT DEFAULT 0 NOT NULL,                                                                             --是否预置:0、自定;1、预置  
    7. [CreatorUserId]    VARCHAR(36) FOREIGN KEY REFERENCES Sys_User(ID) NOT NULL,                                           --创建人ID  
    8. [CreateTime]       DATETIME DEFAULT GETDATE() NOT NULL                                                                 --创建时间  
    9. )  
    10. GO  

    3.3.2   角色成员

    角色成员(用户)表: 

    1. CREATE TABLE Sys_Role_User(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_Role_User UNIQUE CLUSTERED IDENTITY(1,1),                                  --自增序列  
    4. [RoleId]           VARCHAR(36) FOREIGN KEY REFERENCES Sys_Role(ID) ON DELETE CASCADE NOT NULL,                         --角色ID  
    5. [UserId]           VARCHAR(36) FOREIGN KEY REFERENCES Sys_User(ID) NOT NULL,                                           --用户ID  
    6. [CreatorUserId]    VARCHAR(36) FOREIGN KEY REFERENCES Sys_User(ID) NOT NULL,                                           --创建人ID  
    7. [CreateTime]       DATETIME DEFAULT GETDATE() NOT NULL                                                                 --创建时间  
    8. )  
    9. GO  

    3.3.3   角色权限

    角色权限表:

    1. CREATE TABLE Sys_RolePerm_Module(  
    2. [ID]               VARCHAR(36) PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),  
    3. [SN]               BIGINT CONSTRAINT IX_Sys_RolePerm_Module UNIQUE CLUSTERED IDENTITY(1,1),                            --自增序列  
    4. [RoleId]           VARCHAR(36) FOREIGN KEY REFERENCES Sys_Role(ID) ON DELETE CASCADE NOT NULL,                         --角色ID  
    5. [ModuleId]         VARCHAR(36) FOREIGN KEY REFERENCES Sys_Module(ID) ON DELETE CASCADE NOT NULL,                       --模块注册ID  
    6. [Action]           INT DEFAULT 0 NOT NULL,                                                                             --操作行为:0、拒绝访问;1、允许访问  
    7. [Mode]             INT DEFAULT 0 NOT NULL,                                                                             --数据授权范围:-1、仅本人;0、仅本部门;1、本部门所有;2、本机构所有;3、全部;4、自定义  
    8. [Permission]       INT DEFAULT 0 NOT NULL,                                                                             --数据权限:0、只读;1、读写  
    9. [CreatorUserId]    VARCHAR(36) FOREIGN KEY REFERENCES Sys_User(ID) NOT NULL,                                           --创建人ID  
    10. [CreateTime]       DATETIME DEFAULT GETDATE() NOT NULL                                                                 --创建时间  
    11. )  
    12. GO  

    3.4    如何获取用户的权限

    获取指定用户的功能权限需要先获取该用户可以访问的模块,此功能我们可以使用一个数据库表值函数来返回指定用户被授权访问的模块ID列表。在用户启动某一模块时,使用一个数据库表值函数来返回被授权功能的ID列表。

    在用户访问数据时,我们需要对用户访问的数据根据授权情况进行过滤,并为这些数据加上权限标记,以便告知系统用户被许可的操作方式(只读/读写)。

    我们可以在数据访问层前端进行数据的过滤和标记,这种方式的优点是:

    ²  安全,外部没有注入、篡改的机会。

    ²  高效,数据访问层获取的数据已经经过筛选,不会返回无效的数据。

    ²  兼容性好,和应用系统完全无关,即使应用系统通过存储过程处理数据,也能完全兼容。

    简单地来说,这种机制只需要你在获取数据的时候使用inner join一个表值函数,输入函数的参数(模块ID,登录部门ID,用户ID)即可。

    4      数据库函数

    4.1    功能权限函数

    4.1.1   获取授权模块

    1. /*****表值函数:获取当前登录用户允许访问模块*****/  
    2.    
    3. CREATE FUNCTION Get_PermModule(  
    4. @UserId                VARCHAR(36),    --当前登录用户ID  
    5. @OrgId                 VARCHAR(36)     --当前登录部门ID  
    6. )  
    7.    
    8. RETURNS TABLE AS  
    9.    
    10. RETURN  
    11. with Roles as(  
    12.   select R.RoleId                              --获取当前用户作为成员的角色ID  
    13.     from Sys_Role_User R  
    14.     where R.UserId = @UserId  
    15.   union  
    16.   select R.RoleId                              --获取当前用户所在用户组作为成员的角色ID  
    17.     from Sys_Role_UserGroupR  
    18.     join Sys_UserGroupMemberG on G.GroupId = R.GroupId  
    19.       and G.UserId = @UserId  
    20.   union  
    21.   select R.RoleId                              --获取当前用户的职位作为成员的角色ID  
    22.     from Sys_Role_PositionR  
    23.     join Sys_User_Org P on P.OrgId = R.OrgId  
    24.       and P.UserId = @UserId  
    25.     join Sys_OrganizationO on O.ID = R.OrgId  
    26.       and O.ParentId = @OrgId  
    27.   union  
    28.   select R.RoleId                              --获取当前用户的职位作为成员的角色ID(职位对应部门被合并)  
    29.     from Sys_Role_PositionR  
    30.     join Sys_User_Org P on P.OrgId = R.OrgId  
    31.       and P.UserId = @UserId  
    32.     join Sys_OrganizationO on O.ID = R.OrgId  
    33.     join Sys_OrgMerger OM on OM.MergerOrgId = O.ParentId  
    34.       and OM.OrgId = @OrgId  
    35.   )  
    36.    
    37. select M.ModuleId from Roles R  
    38.   join Sys_RolePerm_ModuleM on M.RoleId = R.RoleId  
    39. group by M.ModuleId  
    40. having min(M.Action) > 0  
    41.    
    42. GO  
    4.1.2   获取授权功能

    1. CREATE FUNCTION Get_PermAction(  
    2. @ModuleId              VARCHAR(36),     --模块ID  
    3. @UserId                VARCHAR(36),    --当前登录用户ID  
    4. @OrgId                 VARCHAR(36)     --当前登录部门ID  
    5. )  
    6.    
    7. RETURNS TABLE AS  
    8.    
    9. RETURN  
    10. with Roles as(  
    11.   select R.RoleId                              --获取当前用户作为成员的角色ID  
    12.     from Sys_Role_User R  
    13.     where R.UserId = @UserId  
    14.   union  
    15.   select R.RoleId                              --获取当前用户所在用户组作为成员的角色ID  
    16.     from Sys_Role_UserGroupR  
    17.     join Sys_UserGroupMemberG on G.GroupId = R.GroupId  
    18.       and G.UserId = @UserId  
    19.   union  
    20.   select R.RoleId                              --获取当前用户的职位作为成员的角色ID  
    21.     from Sys_Role_PositionR  
    22.     join Sys_User_Org P on P.OrgId = R.OrgId  
    23.       and P.UserId = @UserId  
    24.     join Sys_OrganizationO on O.ID = R.OrgId  
    25.       and O.ParentId = @OrgId  
    26.   union  
    27.   select R.RoleId                              --获取当前用户的职位作为成员的角色ID(职位对应部门被合并)  
    28.     from Sys_Role_PositionR  
    29.     join Sys_User_Org P on P.OrgId = R.OrgId  
    30.       and P.UserId = @UserId  
    31.     join Sys_OrganizationO on O.ID = R.OrgId  
    32.     join Sys_OrgMerger OM on OM.MergerOrgId = O.ParentId  
    33.       and OM.OrgId = @OrgId  
    34.   )  
    35.    
    36. select A.ActionId from Roles R  
    37.   join Sys_RolePerm_ActionA on A.RoleId = R.RoleId  
    38.   join Sys_ModuleActionM on M.ID = A.ActionId  
    39.     and M.ModuleId = @ModuleId  
    40. group by A.ActionId  
    41. having min(A.Action) > 0  
    42.    
    43. GO  

    4.2    数据权限函数

    4.2.1   获取授权数据(部门模式)

    1. CREATE FUNCTION DataPerm_Org(  
    2. @ModuleId              VARCHAR(36),     --模块ID  
    3. @UserId                VARCHAR(36),     --当前登录用户ID  
    4. @OrgId                 VARCHAR(36)      --当前登录部门ID  
    5. )  
    6.    
    7. RETURNS @PermScope  TABLE(  
    8. OrgId                  VARCHAR(36),  
    9. Permission             INT  
    10. AS  
    11.    
    12. BEGIN  
    13. DECLARE @Mode          INT  
    14. DECLARE @Permission    INT  
    15.    
    16. select @Mode = Mode, @Permission = Permission    --获取指定模块对于当前登录用户和登录部门的数据授权访问范围代码和权限代码  
    17. from Get_PermData(@ModuleId, @UserId, @OrgId)  
    18.    
    19. if @Mode = 0  
    20.   insert into @PermScope                         --授权访问范围为仅本部门时,返回本部门(当前登录部门)ID、合并到该部门的部门ID和权限代码  
    21.     select @OrgId, @Permission  
    22.     union  
    23.     select MergerOrgId, @Permission  
    24.     from Sys_OrgMerger  
    25.     where OrgId = @OrgId  
    26.    
    27. else if @Mode between 1 and 3  
    28.   begin  
    29.   if @Mode = 2  
    30.     select @OrgId = dbo.Get_SupOrg(@OrgId, 1)    --获取上级机构ID  
    31.   if @Mode = 3  
    32.     select @OrgId = dbo.Get_SupOrg(@OrgId, 0)    --获取根机构ID  
    33.   insert into @PermScope                         --授权访问范围为本部门及下属、本机构及下属、全部时,返回本部门(当前登录部门)和相应机构/部门ID、合并到上述部门的部门ID和权限代码  
    34.     select ID, @Permission from Get_SubOrg(@OrgId)  
    35.   end  
    36.    
    37. else if @Mode = 4  
    38.   insert into @PermScope                         --自定义授权范围和权限代码  
    39.     select DC.OrgId, max(DC.Permission)  
    40.     from Sys_RolePerm_DataCustomDC  
    41.     join Sys_RolePerm_ModuleM on M.ID = DC.Perm_ModuleId  
    42.       and M.ModuleId = @ModuleId  
    43.     join Sys_OrganizationO on O.ID = DC.OrgId  
    44.       and O.Validity = 1  
    45.     group by DC.OrgId  
    46.     union  
    47.     select OM.MergerOrgId, max(DC.Permission)  
    48.     from Sys_RolePerm_DataCustomDC  
    49.     join Sys_RolePerm_ModuleM on M.ID = DC.Perm_ModuleId  
    50.       and M.ModuleId = @ModuleId  
    51.     join Sys_OrgMerger OM on OM.OrgId = DC.OrgId  
    52.     group by OM.MergerOrgId  
    53.    
    54. insert into @PermScope                           --无归属部门的数据可被所有人访问  
    55.   select 'All', @Permission  
    56.    
    57. RETURN  
    58. END  
    59. GO  

    4.2.2   获取授权数据(用户模式)

    1. CREATE FUNCTION DataPerm_User(  
    2. @ModuleId              VARCHAR(36),     --模块ID  
    3. @UserId                VARCHAR(36),     --当前登录用户ID  
    4. @OrgId                 VARCHAR(36)      --当前登录部门ID  
    5. )  
    6.    
    7. RETURNS @PermScope  TABLE(  
    8. UserId                 VARCHAR(36),  
    9. Permission             INT  
    10. AS  
    11.    
    12. BEGIN  
    13. DECLARE @Mode          INT  
    14. DECLARE @Permission    INT  
    15.    
    16. select @Mode = Mode, @Permission = Permission    --获取指定模块对于当前登录用户和登录部门的数据授权访问范围代码和权限代码  
    17. from Get_PermData(@ModuleId, @UserId, @OrgId)  
    18.    
    19. if @Mode <0  
    20.   insert into @PermScope  
    21.     select @UserId, @Permission                  --授权访问范围为仅本人时,返回本人ID和权限代码  
    22.    
    23. RETURN  
    24. END  
    25. GO  

    4.2.3   获取数据权限授权模式

    1. CREATE FUNCTION Get_PermData(  
    2. @ModuleId              VARCHAR(36),     --模块ID  
    3. @UserId                VARCHAR(36),     --当前登录用户ID  
    4. @OrgId                 VARCHAR(36)      --当前登录部门ID  
    5. )  
    6.    
    7. RETURNS TABLE AS  
    8.    
    9. RETURN  
    10. with Roles as(  
    11.   select R.RoleId                              --获取当前用户作为成员的角色ID  
    12.     from Sys_Role_User R  
    13.     where R.UserId = @UserId  
    14.   union  
    15.   select R.RoleId                              --获取当前用户所在用户组作为成员的角色ID  
    16.     from Sys_Role_UserGroupR  
    17.     join Sys_UserGroupMemberG on G.GroupId = R.GroupId  
    18.       and G.UserId = @UserId  
    19.   union  
    20.   select R.RoleId                              --获取当前用户的职位作为成员的角色ID  
    21.     from Sys_Role_PositionR  
    22.     join Sys_User_Org P on P.OrgId = R.OrgId  
    23.       and P.UserId = @UserId  
    24.     join Sys_OrganizationO on O.ID = R.OrgId  
    25.       and O.ParentId = @OrgId  
    26.   union  
    27.   select R.RoleId                              --获取当前用户的职位作为成员的角色ID(职位对应部门被合并)  
    28.     from Sys_Role_PositionR  
    29.     join Sys_User_Org P on P.OrgId = R.OrgId  
    30.       and P.UserId = @UserId  
    31.     join Sys_OrganizationO on O.ID = R.OrgId  
    32.     join Sys_OrgMerger OM on OM.MergerOrgId = O.ParentId  
    33.       and OM.OrgId = @OrgId  
    34.   )  
    35.    
    36. select max(M.Permission) as Permission, max(M.Mode) as Mode from Roles R  
    37.   join Sys_RolePerm_ModuleM on M.RoleId = R.RoleId  
    38.     and M.ModuleId = @ModuleId  
    39. group by M.ModuleId  
    40.    
    41. GO  

    4.3    其它函数

    4.3.1   获取上级机构ID

    1. CREATE FUNCTION Get_SupOrg(  
    2. @DeptId                VARCHAR(36),    --部门ID  
    3. @Type                  INT            --机构类型:0、根机构;1、上级机构  
    4. )  
    5.    
    6. RETURNS NVARCHAR(36) AS  
    7. BEGIN  
    8.    
    9. DECLARE @NodeType     INT = 0  
    10. DECLARE @ParentId     VARCHAR(36)  
    11.    
    12. while @NodeType !=1  
    13.   begin  
    14.   select @NodeType = NodeType * @Type, @ParentId = ParentId from Sys_Organizationwhere ID = @DeptId  
    15.   if @ParentId is null  
    16.     set @NodeType = 1  
    17.   if @NodeType != 1  
    18.     set @DeptId = @ParentId  
    19.   end  
    20.    
    21. RETURN @DeptId  
    22. END  
    23. GO  

    4.3.2   获取下属机构/部门ID

    1. CREATE FUNCTION Get_SubOrg(  
    2. @OrgId                 VARCHAR(36)      --组织机构ID  
    3. )  
    4.    
    5. RETURNS TABLE AS  
    6.    
    7. RETURN  
    8. with  
    9. OrgList as (  
    10.   select @OrgId as ID  
    11.   union all  
    12.   select O.ID from Sys_OrganizationO  
    13.   join OrgList L on L.ID = O.ParentId  
    14.   where Validity = 1  
    15.     and NodeType < 3),  
    16. MergerOrg as(  
    17.   select OM.MergerOrgId as ID from OrgList OL  
    18.   join Sys_OrgMerger OM on OM.OrgId = OL.ID  
    19.   union all  
    20.   select O.ID from Sys_OrganizationO  
    21.   join MergerOrg M on M.ID = O.ParentId  
    22.   where Validity = 1  
    23.     and NodeType < 3)  
    24.    
    25. select ID from OrgList  
    26. union  
    27. select ID from MergerOrg  
    28.    
    29. GO  

     

    展开全文
  • 项目是基于jhipster生成...我的做法:在JWT的FILTER里面,添加自己的一些业务逻辑,把数据和菜单权限信息获取到, 并存到JWT中去。 String login = "admin"; String DATA_ACL_STR = ""; try { login = cl...

    项目是基于jhipster生成的后端项目,使用spring boot相关的技术。
    我的做法:
    在JWT的FILTER里面,添加自己的一些业务逻辑,把数据和菜单权限信息获取到, 并存到JWT中去。
     

       String login = "admin";
            String DATA_ACL_STR = "";
            try {
                login = claims.get("sub").toString();
                DATA_ACL_STR = resAclRepository.findAclByUser(login);
             } catch (Exception ex) {
                ex.printStackTrace();
            }
            Collection<? extends GrantedAuthority> authorities = Arrays
                    .stream((claims.get(AUTHORITIES_KEY).toString() + "," + DATA_ACL_STR).split(","))
                    .map(SimpleGrantedAuthority::new).collect(Collectors.toList());
    
            User principal = new User(claims.getSubject(), "", authorities);
    SecurityContextHolder.getContext().setAuthentication(principal);
    

    用到的两张表的设计如下:

    CREATE TABLE `t_res_acl` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `jhi_role` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `res_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `res_value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `created_time` datetime DEFAULT NULL,
      `created_by` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `modified_time` datetime DEFAULT NULL,
      `modified_by` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    
    CREATE TABLE `t_menu_res` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `menu_type` varchar(255) NOT NULL,
      `pid` bigint(20) DEFAULT NULL,
      `permission` varchar(255) NOT NULL,
      `jhi_disable` bit(1) DEFAULT NULL,
      `created_time` datetime,
      `created_by` varchar(255) DEFAULT NULL,
      `modified_time` datetime,
      `modified_by` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    

     


    使用一个自定义的AOP拦截器,拦截特定的几个方法,这几个特定的方法都有一个业务字段,暂且仅对业务进行数据控制。
    拦截到的方法从
                Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    从这个getAuthorities中进行数据检查,因为在前面的JWT FILTER中把权限信息存在这里了。
    同时,在JWTFILTER里根据获取到的用户请求的URL和请求的方法,可以判断是否是需要保护的资源,如果是,则同样从权限中确认一下,
    如果没有访问权限,则中止过滤器,否则继续。
    // 判断权限中是否含有当前URL的访问权限

    if (!authentication.getAuthorities().contains(new SimpleGrantedAuthority(AuthoritiesConstants.ADMIN)) // 管理员角色用户不判断权限
                        && this.tokenProvider.ValidateMenuRes(permission) // 此资源是需要保护的
                        && !authentication.getAuthorities().contains(new SimpleGrantedAuthority(permission))) {
                    servletResponse.getWriter().write("Current User is not authorized to access resource:" + permission);
                    return;
                }
    

     



    转载于:https://www.cnblogs.com/huaxiaoyao/p/10176687.html

    展开全文
  • 摘要: 基于mybatis拦截器实现简单的数据权限管理中心数据权限管理中心由于公司大部分项目都是使用mybatis,也是使用mybatis的拦截器进行分页处理,所以技术上也直接选择从拦截器入手需求场景第一种场景:行级数据...
  • 大数据平台数据权限管理设计

    千次阅读 2020-02-25 15:22:43
    当前大数据团队没有一个统一的操作权限控制和管理平台,对于分析师在服务器上的权限,目前都是给予对应分析节点的EC2机器账号,且为了方便操作和管理都是给予的管理权限,因此安全性风险较大;对于数据开发者,...
  • 通用数据权限管理系统设计

    千次阅读 2007-07-15 23:55:00
    通用数据权限管理系统设计 通用数据权限管理系统设计(一) 作者:逸云 前言: 本文提供一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是RBAC(基于角色的访问控制...
  • 通用数据权限管理系统设计 作者:逸云 前言: 本文提供一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是RBAC(基于角色的访问控制方法)的进一步扩展和延伸,即在功能...
  • 通用数据权限管理系统设计(一) 作者:逸云 前言: 本文提供一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是RBAC(基于角色的访问控制方法)的进一步扩展和延伸,即...
  • 权限管理在来说基本有两个方面: 一、控制页面级访问权限; 页面访问权限控制实质上是控制页面是否显示,这里有两种方法: 1、添加所有路由和菜单,当用户在浏览器输入菜单路径时,不在权限内的显示无权限; ...
  • 通用用户数据权限sql建库 和初始化脚本: /* Navicat MySQL Data Transfer Source Server : 192.168.1.73 Source Server Type : MySQL Source Server Version : 80015 Source Host : 192.168.1.73:3306 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,666
精华内容 9,866
关键字:

数据权限管理