第4章 核心模型设计:用户-角色-权限三元组、角色继承树、权限粒度划分

4.1 本章边界与核心定义

本章聚焦 RBAC 模型的三个基石:用户-角色-权限的静态三元组关系、角色继承树的层次结构,以及权限粒度的纵向切分策略。边界限定在“逻辑模型设计”层面,不涉及物理表实现与 API 接口。理解本章内容是后续章节(会话管理、动态约束、审计)的前提。

4.2 三元组分层架构

三元组并非平铺的三个实体,而是通过分层解耦形成的三层结构:

  1. 用户层:仅与角色关联,不直接持有权限。用户可拥有多个角色,角色可被多个用户复用。
  2. 角色层:承上启下的语义层。角色代表一组权限的集合,同时是权限分配的单位。
  3. 权限层:最细粒度的操作许可。权限仅通过角色间接授予用户。
分层核心职责典型实体变更频率
用户层身份标识与角色映射用户、用户组高
角色层权限聚合与复用角色、角色继承树中
权限层资源操作定义资源、操作、字段低
设计要点:角色层是 RBAC 的核心锚点。权限变更时仅更新角色-权限关联,用户-角色关联不变;人员变动时仅调整用户-角色关联,角色-权限关联不变。这种隔离降低了管理复杂度。

4.3 组件职责与信任链路

  • 认证组件(Authentication):验证用户身份,输出安全主体(Principal)。信任起点。
  • RBAC 引擎:根据主体与上下文查询角色、继承关系及权限,输出授权决策。核心决策者。
  • 角色管理器:维护角色继承树、角色-权限分配表,提供角色层级遍历能力。
  • 策略评估器:对粒度权限(字段/行级)进行上下文匹配,如部门隔离、时间窗口。
  • 数据过滤层:在数据访问层应用权限过滤器,确保返回结果不越级。

控制流简述:用户请求 → 认证组件 → RBAC 引擎(读取用户-角色映射) → 角色管理器(解析继承链) → 策略评估器(检查粒度条件) → 返回允许/拒绝 + 过滤规则。

4.4 角色继承树

角色继承树用于表达角色间的包含关系:子角色自动继承父角色的所有权限,且可以添加专属权限。实现时需重点考虑:

  • 单继承 vs 多继承:单继承结构清晰,多继承可能导致权限来源模糊(钻石问题)。多数生产系统采用单继承+扁平化设计。
  • 继承深度限制:建议不超过 5 层,防止权限推断性能劣化与管理混乱。
  • 循环检测:插入新的继承关系时必须进行有向无环图(DAG)校验,避免死循环。
角色继承树结构 系统管理员 用户管理员 审计管理员 普通操作员 高级操作员 只读操作员 维护操作员 继承规则 子角色继承父角色所有权限 深度 ≤ 5 层,避免循环

4.5 权限粒度划分

权限粒度直接影响模型灵活度与性能。需根据业务场景在“粗粒度”与“细粒度”间选型权衡。粒度划分通常包含三个层次:

  • 粗粒度(功能权限):菜单、页面、路由访问控制。适用于通用模块,权限条目少,评估快。
  • 中粒度(操作权限):增、删、改、查、导出等操作。适用于核心业务实体。
  • 细粒度(字段/行级):特定数据字段可见性、数据行范围限制。适用于财务、医疗等强合规场景。
粒度爆炸风险:如果对所有实体都启用行级权限,权限条目会瞬间膨胀(用户数 × 角色数 × 资源数),导致 RBAC 引擎性能退化。建议仅在敏感资源(如薪资、病历)上启用细粒度,并在业务层使用策略模式而非纯数据库过滤。

4.6 选型权衡与风险点

决策项选项 A选项 B风险与缓解
继承方式单继承 + 扁平多继承多继承导致权限重复计算;建议限制深度 + 缓存继承路径
粒度策略统一功能级混合粒度(功能+字段)字段级使用动态策略评估,避免硬编码到权限表
角色数量≤ 50 个> 200 个角色膨胀会加剧管理负担;使用角色分组 + 自动清理
权限存储关系型数据库内存图数据库图数据库更适合继承遍历;但增加运维复杂度

4.7 落地步骤(五步法)

  1. 枚举资源与操作:列出所有受控资源(接口、数据实体、页面),并为每个资源定义允许的操作集。
  2. 定义角色层次:根据组织架构设计角色继承链,确保每个角色只有一个直接父角色,避免菱形继承。
  3. 划分粒度阈值:明确哪些资源使用粗粒度,哪些使用细粒度,并在架构文档中标记粒度边界。
  4. 构建三元组映射:建立用户-角色、角色-权限两张关联表,并为角色继承树单独建立闭包表或邻接表。
  5. 集成策略缓存:在 RBAC 引擎中缓存角色继承路径与权限集合,减少数据库压力。

4.8 验收标准

  • 功能完整性:任意用户登录后,其可见菜单、可操作按钮与所属角色的权限完全一致,且继承链中的祖先权限全部生效。
  • 粒度准确性:细粒度场景下(例如用户只能查看本部门订单),系统返回的数据行数符合预期,不存在越权数据泄露。
  • 性能基线:在 1000 个角色、深度 5 层的继承树中,一次完整的权限评估延迟 ≤ 50ms(含缓存命中)。
  • 循环保护:插入新的继承关系时,接口必须拒绝循环引用,并返回明确错误码。