2 RBAC基础模型:核心概念、三层结构、角色继承与静态职责分离

2.1 边界与分层

RBAC 将权限管理抽象为用户(User)、角色(Role)、权限(Permission)三个核心实体,通过角色作为中间层解耦用户与权限的直接绑定。模型边界定义如下:

  • 适用场景:企业级应用、内部管理系统、多租户平台,需要粗粒度静态授权。
  • 不适场景:资源属性高度动态、上下文敏感的授权(如“仅允许访问自己创建的资源”)。

RBAC 标准采用三层结构,每层职责清晰隔离:

分层核心映射职责说明
用户-角色分配层用户 → 角色 (UA)将用户关联到一个或多个角色,通常由管理员维护。
角色-权限分配层角色 → 权限 (PA)定义角色拥有的操作集合,与用户解耦。
会话层用户启动会话,激活角色子集控制用户在本次会话中实际生效的角色和权限。
架构要点:三层分离使得权限变更只需修改角色-权限映射,不影响用户分配;用户岗位调整仅需修改用户-角色映射,不影响底层权限定义。

2.2 核心概念与组件职责

组件符号职责描述
用户 (User)U系统使用者,可以是人、设备或服务账号。
角色 (Role)R权限的集合,代表岗位、职责或功能组。
权限 (Permission)P对资源执行特定操作(读、写、删除等)的授权。
会话 (Session)S用户登录后创建的临时上下文,包含激活的角色集合。
角色继承 (RH)→子角色自动获得父角色的所有权限,形成层级关系。
静态职责分离 (SSD)⊗预先定义互斥角色组,同一用户不能被同时赋予组内的两个角色。

2.3 角色继承与静态职责分离

角色继承(Role Hierarchy, RH)允许定义偏序关系:如果角色 A 继承角色 B,则拥有 A 的用户自动获得 B 的所有权限。继承关系传递且非对称,常用于组织结构(如“项目经理”继承“工程师”)。

示例:角色“高级工程师”继承“工程师”,则高级工程师拥有工程师的全部权限,并额外拥有代码审查权限。

静态职责分离(Static Separation of Duty, SSD)通过预定义互斥角色集(Mutually Exclusive Roles, MER)实现最简约束:同一用户不能同时被分配互斥角色。例如,财务系统中的“出纳”和“会计”角色互斥,以防止舞弊。

SSD 通常通过配置规则实现:

// 典型 SSD 规则定义(伪配置)
{
  "ssdPolicies": [
    {
      "merName": "财务互斥组",
      "roles": ["出纳", "会计", "审计"],
      "maxAssignment": 1
    }
  ]
}

2.4 数据流与控制流(信任链路)

以下 SVG 展示了 RBAC 核心模型的实体关系、继承链路及 SSD 约束:

RBAC 核心模型(含继承与SSD) 用户 (User) 角色A 角色B 角色C 角色D 权限1 (读) 权限2 (写) 权限3 (删除) SSD 图例: 蓝色节点=用户 绿色节点=角色 橙色节点=权限 紫色虚线=角色继承(子→父) 红色X=SSD互斥 实线箭头=直接分配 虚线箭头=间接分配/继承 用户可同时拥有角色A和角色B,但不可同时拥有角色A和角色C

2.5 选型权衡与风险点

维度RBAC 特点风险点
粒度粗粒度,适合业务角色稳定场景无法处理“仅允许访问本月数据”等细粒度上下文
角色管理角色数量可控(通常 < 100)角色爆炸:每个细粒度操作都创建新角色,导致管理失控
继承复杂度树状继承,易于理解深层继承可能带来意外权限泄漏(子角色获得不应拥有的权限)
SSD 约束静态预定义,运行时不验证仅约束用户分配阶段,无法防止会话级劫持
常见陷阱:
  1. 平铺角色:将每个页面/按钮都映射为一个角色,导致数千个角色维护困难。
  2. 继承层次过深:超过 4 层后权限溯源极其困难。
  3. SSD 规则遗漏:未配置互斥角色,造成权限冲突漏洞。

2.6 落地步骤

  1. 角色梳理:与业务方共同识别组织中的岗位/职责,合并重复角色,控制角色总数在 30~80 个。
  2. 权限定义:将资源操作(CRUD)标准化为权限原子,按模块分组。
  3. 角色-权限映射:为每个角色分配最小必要权限,利用继承减少重复分配。
  4. 用户-角色分配:将用户赋予对应角色,同时检测 SSD 冲突(例如使用静态检查脚本)。
  5. 继承与SSD配置:定义角色继承关系,配置互斥角色组并加入 CI 校验。
  6. 会话与生效:实现用户登录时激活角色子集(可选),确保权限实时生效。
推荐工具:使用可视化角色编辑器(如 Apache Ranger 或 Keycloak)管理继承树和 SSD 规则,避免手写配置错误。

2.7 验收标准

  • 功能正确性:用户登录后只能访问其角色关联的权限,未授予的操作被明确拒绝(返回 403)。
  • 继承验证:为子角色新增权限后,子角色用户立即获得该权限;移除父角色权限不影响子角色的继承权限(仅影响未来分配)。
  • SSD 验证:尝试为已拥有角色 A 的用户分配互斥角色 C 时,系统拒绝并给出明确错误信息。
  • 性能标准:权限查询延迟 < 10ms(基于缓存角色-权限表),用户-角色变更传播时间 < 30s。
  • 可审计性:所有 UA/PA 变更记录日志,SSD 冲突事件需告警通知。