2. 访问控制模型基础:DAC、MAC、RBAC、ABAC 模型对比与选型
聊权限模型之前,我先问个问题:你给系统设计权限时,第一反应是什么?
很多人会直接说「搞个角色呗」。嗯,这其实就是 RBAC 的思路。但现实往往没那么简单——我见过不少项目,角色越加越多,最后比用户数还多,权限管理反而成了灾难。
所以这一章,咱们把四种主流模型掰开揉碎讲清楚。DAC、MAC、RBAC、ABAC,它们各自解决什么问题?又该在什么场景下选型?
2.1 DAC:自主访问控制
DAC 的全称是 Discretionary Access Control。说白了就是「谁创建,谁做主」。
文件的主人可以自己决定谁能读、谁能写。Linux 文件权限就是典型例子——chmod 755 这种操作,你肯定不陌生。
我在早期做内部工具时用过 DAC。当时觉得挺方便,用户自己分享文件就行。但很快发现问题了——权限传播不可控。A 把文件分享给 B,B 又分享给 C,最后连谁有权限都查不清楚。
2.2 MAC:强制访问控制
MAC 跟 DAC 正好相反。它不信任用户,所有权限由系统强制规定。
每个主体(用户/进程)和客体(文件/资源)都有安全标签。系统根据标签决定能否访问。典型的例子是 SELinux 和军事系统的多级安全模型。
| 模型 | 控制者 | 灵活性 | 安全性 | 典型场景 |
|---|---|---|---|---|
| DAC | 资源所有者 | 高 | 低 | 个人文件共享 |
| MAC | 系统管理员 | 低 | 高 | 军事、政府机密系统 |
MAC 的好处是安全等级高,用户没法绕过。但坏处也很明显——配置太复杂。我接触过一些政府项目,光安全标签的定义就写了上百页文档。说实话,普通企业根本玩不转。
2.3 RBAC:基于角色的访问控制
RBAC 是目前最主流的模型。它的核心思路是:用户不直接关联权限,而是通过角色来间接关联。
你想想看,一个公司里,员工有「管理员」「编辑」「访客」这些角色。每个角色对应一组权限。用户加入某个角色,就自动获得该角色的权限。这就是 RBAC 的基本思想。
// RBAC 核心关系示例
User → Role → Permission
// 实际数据模型
users: { id, name }
roles: { id, name, description }
permissions: { id, resource, action }
user_roles: { user_id, role_id }
role_permissions: { role_id, permission_id }
我在做 Catalog 权限系统时,第一版用的就是 RBAC。为什么?因为它够直观。产品经理能理解,开发也好实现。但后来遇到一个问题:角色粒度不好控制。
举个例子:A 部门需要「查看订单」权限,B 部门需要「查看订单 + 导出订单」权限。按 RBAC 你得建两个角色。如果还有 C、D、E 部门呢?角色数量会线性增长。
2.4 ABAC:基于属性的访问控制
ABAC 是 RBAC 的升级版。它不再依赖固定的角色,而是根据属性动态计算权限。
属性可以是:用户属性(部门、职级)、资源属性(机密等级、所属项目)、环境属性(时间、IP 地址)。
// ABAC 策略示例(伪代码)
策略:允许查看订单
条件:
- 用户.部门 == 订单.所属部门
- 用户.职级 >= "高级"
- 当前时间 BETWEEN "09:00" AND "18:00"
- 用户.IP 属于公司内网
你看,ABAC 的粒度可以非常细。而且不需要提前定义角色,策略是动态计算的。我最近在做的 Catalog 权限系统第二版,就引入了 ABAC 来处理那些「角色说不清楚」的场景。
2.5 四种模型对比总结
| 维度 | DAC | MAC | RBAC | ABAC |
|---|---|---|---|---|
| 控制粒度 | 粗 | 中 | 中 | 细 |
| 灵活性 | 高 | 低 | 中 | 高 |
| 管理成本 | 低 | 高 | 中 | 高 |
| 安全性 | 低 | 高 | 中 | 高 |
| 适用规模 | 个人/小团队 | 高安全领域 | 中大型企业 | 复杂业务场景 |
| 实现复杂度 | 简单 | 复杂 | 中等 | 复杂 |
2.6 选型建议
说了这么多,到底怎么选?我个人的经验是分三步走:
- 先看规模: 少于 50 人,DAC 凑合用。50-5000 人,RBAC 是首选。超过 5000 人或者业务复杂,考虑 RBAC + ABAC 混合。
- 再看安全要求: 有合规审计需求?上 MAC 或 ABAC。普通业务系统,RBAC 足够。
- 最后看团队能力: 团队没有权限方面的专家?老老实实用 RBAC。ABAC 和 MAC 的维护成本不是开玩笑的。
好了,四种模型讲完了。下一节咱们会深入 RBAC 的细节——毕竟这是 Catalog 权限系统的基石。但在此之前,你可以想想自己现在的系统用的是哪种模型?有没有遇到我提到的那些问题?