RBAC权限模型
RBAC(Role-Based Access Control,基于角色的访问控制)是目前企业系统最主流的权限模型,也是绝大多数后台管理系统(OA、ERP、CRM、MES、IAM、Kubernetes、Linux sudo 等)的基础。
相比直接给用户分配权限,RBAC引入了一个角色(Role)作为中间层:
用户 → 角色 → 权限
这样权限管理会简单很多。
RBAC 的核心元素
经典 RBAC 一共有四个对象。
1 | User(用户) |
最重要的是前三个。
关系如下:
1 | User |
权限(Permission)到底是什么?
权限其实就是:
允许执行某个操作。
例如:
1 | GET /users |
也可以是:
1 | 文章阅读 |
也可以:
1 | 菜单显示 |
通常一个权限至少包含:
1 | 资源(Resource) |
例如:
1 | user:create |
很多框架都采用这种字符串。
RBAC 的数据库设计
经典设计:
1 | user |
全部都是多对多。
例如:
1 | 张三 |
所以:
一个用户可以多个角色。
一个角色也可以多个权限。
RBAC0(基础模型)
这是最基础版本。
只有:
1 | User |
关系:
1 | User |
例如:
1 | 管理员 |
这是95%的后台。
RBAC1(角色继承)
角色也可以继承。
例如:
1 | 普通员工 |
图:
1 | 经理 |
例如:
1 | 员工: |
不用重复配置。
继承即可。
RBAC2(约束)
增加各种规则。
例如:
互斥角色
一个人不能同时:
1 | 财务 |
否则:
自己审批自己。
所以:
1 | 不能同时拥有两个角色 |
最大角色数
例如:
1 | 一个用户最多3个角色 |
前置角色
例如:
1 | 只有主管 |
动态约束
例如:
登录以后:
1 | 今天只能启用: |
因为:
避免权限冲突。
RBAC3
就是:
1 | RBAC1 |
既支持继承。
也支持约束。
也是 ANSI/NIST RBAC 标准。
Session(会话)
很多人不知道 Session。
其实很重要。
例如:
张三:
1 | 管理员 |
登录以后:
系统问:
1 | 请选择: |
本次:
只启用:
1 | 开发 |
那么:
管理员权限不会生效。
这样更安全。
很多大型 IAM(身份与访问管理)系统都支持这种机制。
RBAC 的优点
① 权限复用
例如:
100 个客服。
只需要:
1 | 客服 |
新增员工:
1 | 加入客服角色 |
结束。
② 易维护
离职:
1 | 删除用户 |
岗位调整:
1 | 运营 |
改角色即可。
③ 权限统一
所有客服权限一样。
不会:
1 | 张三少一个权限 |
④ 审计方便
查看:
1 | 为什么有权限? |
一路追踪:
1 | 张三 |
非常清晰。
⑤ 扩展方便
新增:
1 | 直播运营 |
创建一个角色即可。
不用改代码。
RBAC 的缺点
① 粒度不够细
例如:
运营:
1 | 可以修改商品 |
但是:
1 | 只能修改自己负责的商品 |
RBAC 表达不了。
它只能:
1 | 能 |
不能:
1 | 能修改自己的 |
② 数据权限不好处理
例如:
销售:
1 | 只能看到自己的客户 |
经理:
1 | 可以看到部门客户 |
总监:
1 | 可以看到全公司 |
RBAC 做不了。
这属于:
数据权限(Data Authorization)。
通常需要配合组织架构、部门树、区域、标签或策略来实现。
③ 角色爆炸(Role Explosion)
这是 RBAC 最大的问题。
假设:
1 | 运营 |
最后:
1 | 几百个角色 |
越来越乱。
④ 临时权限麻烦
例如:
领导说:
1 | 今天让张三 |
RBAC:
只能:
1 | 新建角色 |
不优雅。
实际中通常会支持临时授权(带有效期)或直接授予少量例外权限。
⑤ 特殊用户难处理
例如:
CEO:
1 | 拥有所有权限 |
但是:
1 | 不能删除日志 |
RBAC:
可能需要:
1 | CEO角色 |
再单独减权限。
容易复杂。
RBAC 与 ACL、ABAC 的对比
| 模型 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| ACL(Access Control List) | 用户 → 权限 | 粒度细,灵活 | 权限关系爆炸,难维护 | 文件系统、对象权限(如每个文件的读写权限) |
| RBAC(Role-Based Access Control) | 用户 → 角色 → 权限 | 简单、易维护、符合组织结构 | 数据权限和复杂场景支持不足,角色易膨胀 | 企业后台、ERP、OA、IAM、Kubernetes、Linux sudo |
| ABAC(Attribute-Based Access Control) | 根据用户、资源、环境等属性动态决策 | 最灵活,可表达复杂规则 | 实现复杂、调试和审计成本高 | 云平台、金融、政府、零信任架构 |
例如,ABAC 可以直接表达:
1 | 允许访问,当且仅当: |
这是传统 RBAC 难以直接表示的。
现代企业的实践
纯 RBAC 已经越来越少见,大多数成熟系统采用混合模型:
1 | 用户 |
例如一个 CRM 系统中:
- RBAC:决定你能否访问“客户管理”“合同审批”等功能。
- 数据权限:决定你只能看自己的客户、部门客户还是全公司的客户。
- ABAC:进一步限制如“只能在工作时间审批”或“必须通过公司 VPN 才能导出数据”。
因此,RBAC 更适合作为权限体系的“骨架”,而数据权限和策略控制则负责解决细粒度访问控制问题。大型企业(尤其是 SaaS、多租户和云平台)通常都会将这几种模型结合使用,而不是只依赖单一的 RBAC。