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,最后连谁有权限都查不清楚。

避坑: DAC 不适合企业级场景。权限扩散太快,审计基本是摆设。我曾经在一个 200 人的团队里查权限归属,查了三天没查明白——因为权限链早就乱成一锅粥了。

2.2 MAC:强制访问控制

MAC 跟 DAC 正好相反。它不信任用户,所有权限由系统强制规定。

每个主体(用户/进程)和客体(文件/资源)都有安全标签。系统根据标签决定能否访问。典型的例子是 SELinux 和军事系统的多级安全模型。

模型 控制者 灵活性 安全性 典型场景
DAC 资源所有者 高 低 个人文件共享
MAC 系统管理员 低 高 军事、政府机密系统

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。为什么?因为它够直观。产品经理能理解,开发也好实现。但后来遇到一个问题:角色粒度不好控制。

RBAC 的痛点: 角色爆炸。当业务复杂到一定程度,你会发现需要成百上千个角色。每个角色只差一两个权限,但你又不能合并——因为合并后权限就多了。

举个例子:A 部门需要「查看订单」权限,B 部门需要「查看订单 + 导出订单」权限。按 RBAC 你得建两个角色。如果还有 C、D、E 部门呢?角色数量会线性增长。

2.4 ABAC:基于属性的访问控制

ABAC 是 RBAC 的升级版。它不再依赖固定的角色,而是根据属性动态计算权限。

属性可以是:用户属性(部门、职级)、资源属性(机密等级、所属项目)、环境属性(时间、IP 地址)。

// ABAC 策略示例(伪代码)
策略:允许查看订单
条件:
  - 用户.部门 == 订单.所属部门
  - 用户.职级 >= "高级"
  - 当前时间 BETWEEN "09:00" AND "18:00"
  - 用户.IP 属于公司内网

你看,ABAC 的粒度可以非常细。而且不需要提前定义角色,策略是动态计算的。我最近在做的 Catalog 权限系统第二版,就引入了 ABAC 来处理那些「角色说不清楚」的场景。

实际经验: ABAC 虽好,但别滥用。我见过一个团队把所有权限都写成 ABAC 策略,结果策略数量超过 5000 条,每次鉴权都要扫描所有策略,性能直接崩了。我的建议是:80% 的场景用 RBAC,剩下 20% 的复杂场景用 ABAC 补充。

2.5 四种模型对比总结

维度 DAC MAC RBAC ABAC
控制粒度 粗 中 中 细
灵活性 高 低 中 高
管理成本 低 高 中 高
安全性 低 高 中 高
适用规模 个人/小团队 高安全领域 中大型企业 复杂业务场景
实现复杂度 简单 复杂 中等 复杂

2.6 选型建议

说了这么多,到底怎么选?我个人的经验是分三步走:

  1. 先看规模: 少于 50 人,DAC 凑合用。50-5000 人,RBAC 是首选。超过 5000 人或者业务复杂,考虑 RBAC + ABAC 混合。
  2. 再看安全要求: 有合规审计需求?上 MAC 或 ABAC。普通业务系统,RBAC 足够。
  3. 最后看团队能力: 团队没有权限方面的专家?老老实实用 RBAC。ABAC 和 MAC 的维护成本不是开玩笑的。
我曾经踩过的坑: 有个项目一开始就上了 ABAC,觉得「一步到位」。结果半年后,策略管理混乱到没人敢改。最后不得不回退到 RBAC,把 ABAC 只用在几个核心场景。所以我的建议是:从简单开始,按需演进。

好了,四种模型讲完了。下一节咱们会深入 RBAC 的细节——毕竟这是 Catalog 权限系统的基石。但在此之前,你可以想想自己现在的系统用的是哪种模型?有没有遇到我提到的那些问题?

访问控制模型选型决策流程 开始选型 用户规模 < 50 人? 是 DAC 否 高安全合规要求? 是 MAC 否 业务逻辑复杂? 是 ABAC 否 RBAC 建议:80% 场景用 RBAC,复杂场景用 ABAC 补充。DAC 和 MAC 只在特定场景使用。 从简单开始,按需演进——这是我踩过坑后的真心话。