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 约束:
2.5 选型权衡与风险点
| 维度 | RBAC 特点 | 风险点 |
|---|---|---|
| 粒度 | 粗粒度,适合业务角色稳定场景 | 无法处理“仅允许访问本月数据”等细粒度上下文 |
| 角色管理 | 角色数量可控(通常 < 100) | 角色爆炸:每个细粒度操作都创建新角色,导致管理失控 |
| 继承复杂度 | 树状继承,易于理解 | 深层继承可能带来意外权限泄漏(子角色获得不应拥有的权限) |
| SSD 约束 | 静态预定义,运行时不验证 | 仅约束用户分配阶段,无法防止会话级劫持 |
常见陷阱:
- 平铺角色:将每个页面/按钮都映射为一个角色,导致数千个角色维护困难。
- 继承层次过深:超过 4 层后权限溯源极其困难。
- SSD 规则遗漏:未配置互斥角色,造成权限冲突漏洞。
2.6 落地步骤
- 角色梳理:与业务方共同识别组织中的岗位/职责,合并重复角色,控制角色总数在 30~80 个。
- 权限定义:将资源操作(CRUD)标准化为权限原子,按模块分组。
- 角色-权限映射:为每个角色分配最小必要权限,利用继承减少重复分配。
- 用户-角色分配:将用户赋予对应角色,同时检测 SSD 冲突(例如使用静态检查脚本)。
- 继承与SSD配置:定义角色继承关系,配置互斥角色组并加入 CI 校验。
- 会话与生效:实现用户登录时激活角色子集(可选),确保权限实时生效。
推荐工具:使用可视化角色编辑器(如 Apache Ranger 或 Keycloak)管理继承树和 SSD 规则,避免手写配置错误。
2.7 验收标准
- 功能正确性:用户登录后只能访问其角色关联的权限,未授予的操作被明确拒绝(返回 403)。
- 继承验证:为子角色新增权限后,子角色用户立即获得该权限;移除父角色权限不影响子角色的继承权限(仅影响未来分配)。
- SSD 验证:尝试为已拥有角色 A 的用户分配互斥角色 C 时,系统拒绝并给出明确错误信息。
- 性能标准:权限查询延迟 < 10ms(基于缓存角色-权限表),用户-角色变更传播时间 < 30s。
- 可审计性:所有 UA/PA 变更记录日志,SSD 冲突事件需告警通知。