后端权限模型通常分为下面几类,实际系统往往是组合使用。

模型 核心判断 适用场景 示例
RBAC(角色权限) 用户是否拥有某角色,角色是否拥有权限 管理后台、企业系统 管理员可删用户;开发者可发布应用
ACL(访问控制列表) 某个资源允许哪些具体用户/主体访问 文件、文档、项目等资源级授权 文档 A 允许张三读写、李四只读
ABAC(属性权限) 根据用户、资源、环境属性动态决策 多租户、复杂数据权限 仅允许“所属部门=当前用户部门”的数据
PBAC(策略权限) 使用可配置策略引擎判定 规则复杂、需运营配置 工作日、内网且风险等级低时允许导出
ReBAC(关系权限) 根据主体和资源之间的关系判断 协作平台、社交、知识库 项目成员、文档协作者可访问
MAC(强制访问控制) 按安全等级与密级强制控制 政务、军工、高安全系统 机密级用户不能读绝密文档
DAC(自主访问控制) 资源拥有者自行授予/回收权限 文件系统、个人资源 文件创建者分享给指定同事

最常见:RBAC

用户 → 用户角色关系 → 角色 → 角色权限关系 → 权限
用户:zhangsan
角色:应用管理员
权限:app:create、app:publish、app:delete

优点是易理解、易管理;缺点是资源范围复杂时,角色会膨胀。你当前工程基本是这个模式,并通过 moduleKey + moduleType 给角色增加资源作用域。

RBAC 的常见扩展

  • RBAC0:用户、角色、权限三者基础关系。
  • RBAC1:支持角色继承,例如“超级管理员”继承“管理员”。
  • RBAC2:支持约束,例如职责分离、互斥角色、角色人数上限。
  • RBAC3:RBAC1 + RBAC2。

ACL:资源直接授权

project:1001
  zhangsan: READ, WRITE
  lisi: READ

适合每份资源的授权都不同的场景。缺点是数据量与管理复杂度会随资源数量快速增长。

ABAC:属性驱动

allow if:
  user.tenantId == resource.tenantId
  && user.departmentId == resource.departmentId
  && request.time within workHours

属性可来自:

  • 主体:用户、角色、部门、岗位、租户;
  • 资源:所属组织、创建人、密级、状态;
  • 环境:IP、时间、设备、地域、风险等级;
  • 操作:查看、编辑、导出、删除。

它比 RBAC 灵活,但规则调试、审计与可解释性更难。

ReBAC:关系驱动

viewer(document) = owner
                or editor
                or member_of(document.project)

适合“项目成员可看项目资料”“上级可查看下属数据”“好友可查看动态”等关系网密集的产品。常见实现思路参考 Google Zanzibar 类模型。

工程上常用的组合

认证(SSO / JWT / Session)
  → 功能权限:RBAC
  → 数据范围:RBAC Scope / ABAC
  → 单资源共享:ACL 或 ReBAC
  → 高风险动作:PBAC(附加时间、IP、审批等策略)

例如:

  • “能否进入应用管理页”:RBAC。
  • “能看哪些应用”:按租户、项目、部门做 ABAC 或带资源范围的 RBAC。
  • “能否查看某个被分享的文档”:ACL/ReBAC。
  • “能否导出全量数据”:RBAC 基础权限 + PBAC 风险策略。

实践中,不建议一开始就上纯 ABAC 或复杂策略引擎。多数企业后台先采用 RBAC + 资源作用域,当出现文档分享、跨组织协作、细粒度资源授权时,再补充 ACL 或 ReBAC。