• Java,设计,功能权限和数据权限,用户、角色、权限和用户组


    权限系统相关概念

    ACL(Access Control List),访问控制列表

    ACL是一种访问控制机制,包含三个关键要素:用户(User)、资源(Resource)和操作(Operate),当用户请求操作资源时,检查资源的权限列表,如果资源的权限列表中存在该用户的操作权限则允许,否则拒绝。

    BAC(Role-Based Access Control),基于角色的访问控制

    RBAC模型,三个基础组成部分:用户(User)、角色(Role)和权限(Privilege),通过定义角色的权限,授予用户某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型);

    RBAC权限授权,实际上是:Who、What、How,构成了访问权限三元组,也就是:Who对What(Which)进行How的操作。

    Who:权限的拥用者或主体,如:Principal、User、Group、 Role、Actor等等;

    What:权限针对的对象或资源(Resource、Class);

    How:具体的权限(Privilege,正向授权与负向授权);

    Operator:操作,表明对What的How操作,也就是:权限(Privilege)+ 资源(Resource);

    Role:角色,一定数量的权限的集合,权限分配的单位与载体,目的是隔离用户(User)和权限(Privilege)的逻辑关系;

    Group:用户组,权限分配的单位与载体,权限不考虑分配给特定的用户而给组,组可以包括组(以实现权限的继承),也可以包含用户,组内用户继承组的权限,User与Group是多对多的关系,Group可以层次化,以满足不同层级权限控制的要求。

    RBAC是一种分析模型,主要分为:基本模型RBAC0(Core RBAC)、角色分层模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和统一模型RBAC3(Combines RBAC);

    RBAC0,是RBAC0的核心,定义了能构成RBAC控制系统的最小的元素集合,由四部分构成:用户(User)、角色(Role)、会话(Session)、许可(Pemission),RBAC1、RBAC2、RBAC3都是先后在RBAC0的基础上扩展的。

    RBAC1,是RBAC角色的分层模型,在角色中引入了继承的概念,有了继承角色就有了上下级或者等级关系。

    RBAC2,是RBAC的约束模型,在RBAC0基础上加入约束的概念,主要引入了:静态职责分离SSD(Static Separation of Duty)和动态职责分离DSD(Dynamic Separation of Duty)。

    SSD(Static Separation of Duty)是用户和角色的指派阶段加入的,主要是对用户和角色有如下约束:

    1、互斥角色:同一个用户在两个互斥角色中只能选择一个;

    2、基数约束:一个用户拥有的角色是有限的,一个角色拥有的许可也是有限的;

    3、先决条件约束:用户想要获得高级角色,首先必须拥有低级角色;

    DSD(Dynamic Separation of Duty)是会话和角色之间的约束,可以动态的约束用户拥有的角色,如:一个用户可以拥有两个角色,但是运行时只能激活一个角色。

    RBAC3,是RBAC1与RBAC2合集,既有角色分层又有约束的一种模型。

    RBAC(Resource-Based Access Control),基于资源的权限管理

    基于资源的权限管理,以资源为中心进行的访问控制,由于基于角色的权限访问控制,角色所对应的权限发生变化,判断逻辑就必须发生改变,可扩展性差,如果是基于资源的权限访问控制,只需要为资源分配相应的权限,直接判断用户是否拥有该权限即可,可扩展性强。

    1. // 基于角色:
    2. if (user.hasRole("Project Manager") || user.hasRole("Department Manager") ) {
    3. //显示报表按钮
    4. } else {
    5. //不显示按钮
    6. }
    7. // 基于权限:
    8. if (user.isPermitted("projectReport:view:123456")) {
    9. //显示报表按钮
    10. } else {
    11. //不显示按钮
    12. }

     其它权限模型

    系统权限(System Authority)=功能权限+数据权限

    系统权限设计,数据库表设计(仅供参考):

    以下设计,包含了几种模型,实际应用中取其一即可~

    功能权限表:

    1. /** 功能权限 **/
    2. CREATE TABLE `system_permission` (
    3. `id` BIGINT(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID' primary key,
    4. `name` VARCHAR(32) NOT NULL COMMENT '菜单名称',
    5. `permission` VARCHAR(32) NULL DEFAULT NULL COMMENT '菜单权限标识',
    6. `path` VARCHAR(128) NULL DEFAULT NULL COMMENT '前端URL',
    7. `url` VARCHAR(128) NULL DEFAULT NULL COMMENT '请求链接',
    8. `method` VARCHAR(32) NULL DEFAULT NULL COMMENT '请求方法',
    9. `parent_id` INT(11) NULL DEFAULT NULL COMMENT '父菜单ID',
    10. `icon` VARCHAR(32) NULL DEFAULT NULL COMMENT '图标',
    11. `component` VARCHAR(64) NULL DEFAULT NUL
  • 相关阅读:
    Kotlin+MVVM 构建todo App 应用
    【Pytorch实用教程】nn.LogSoftmax的详细用法及公式
    09-流媒体-FLV解复用
    浅谈人工智能怎么提升工作效率
    拿什么拯救你?这暴热的天气!只能在家用python分析做个可视化康康
    数字取证对有效企业事件响应的重要性
    [二进制学习笔记]Ubuntu20.04安装pip2&pip3
    案例丨低代码快速开发平台在信息安全企业里的应用
    【leetcode刷题】练习Day1 1480.一维数组的动态和
    word图片的标题跑到了图片的上方。
  • 原文地址:https://blog.csdn.net/zhaohuodian/article/details/126570667