1. 权限模型概述:RBAC与ABAC的概念、发展历程、典型应用场景与选型对比

1.1 为什么我们要聊权限模型?

说实话,我做了十几年后台系统,遇到最多的问题不是并发,不是缓存,而是权限。你想想看,一个系统上线后,业务方天天改权限需求——这个角色要加个按钮,那个部门只能看部分数据……如果没有好的权限模型支撑,代码会变得非常痛苦。

我个人习惯是先想清楚权限模型,再写业务代码。为什么呢?因为权限的变更频率其实很高,但模型的骨架一旦搭错,后面改起来就是牵一发动全身。嗯,这就是咱们这章要聊透的东西。

1.2 RBAC 到底是什么?

RBAC(Role-Based Access Control),基于角色的访问控制。核心思想很简单:用户 → 角色 → 权限。用户不直接挂权限,而是通过角色间接获得权限。

我记得最早接触RBAC是在一个政府OA项目里,很典型的场景:系统有“管理员”、“审批员”、“普通员工”三种角色,每个角色对应一组菜单和操作权限。当时觉得这设计真清晰啊,后来发现当角色数量膨胀到几十个时,事情就没那么简单了。

RBAC 核心三要素:

  • 用户(User):系统中的主体,可以是人,也可以是服务账号。
  • 角色(Role):权限的集合,是用户与权限之间的桥梁。
  • 权限(Permission):对某个资源(Resource)执行某个操作(Action)的许可。

1.3 RBAC 的发展历程

RBAC 最早由 Ferraiolo 和 Kuhn 在 1992 年提出,后来被 NIST(美国国家标准与技术研究院)标准化。经历了几个阶段:

  • RBAC0(核心模型):用户-角色-权限,最基础版本。
  • RBAC1(角色分层):角色可以继承,比如“超级管理员”继承“普通管理员”的所有权限。
  • RBAC2(约束模型):加入了互斥角色、基数约束等规则。比如一个人不能同时拥有“审批员”和“出纳”角色。
  • RBAC3(统一模型):RBAC1 + RBAC2 的合体。

在实际项目中,大多数场景用 RBAC0 或 RBAC1 就够了。我曾经在一个项目中把 RBAC2 的互斥规则搞得太复杂,结果新员工入职时角色分配老出错,后来干脆简化了。避坑指南:别一开始就追求完美的约束,先跑通再优化。

1.4 ABAC 又是个啥?

ABAC(Attribute-Based Access Control),基于属性的访问控制。它不依赖角色,而是根据主体属性、资源属性、环境属性动态判断权限。

说白了,RBAC 是“你是经理,所以你能审批 10 万以内的报销”,ABAC 是“如果当前用户的职级是经理、所在部门是财务部、报销金额小于10万、且当前时间是工作时间,那么允许审批”。

ABAC 的典型属性分类:

  • 主体属性:用户ID、部门、职级、区域、是否VIP等。
  • 资源属性:文档类型、数据敏感级别、所属项目等。
  • 环境属性:当前时间、IP地址、设备类型、网络环境等。

我最早接触 ABAC 是在一个 SaaS 多租户系统里。租户 A 的管理员只能看到自己公司的数据,但同一个角色在不同租户下要求完全隔离。如果用 RBAC,得给每个租户各自建一套角色,很蠢。ABAC 通过“租户ID”属性直接解决。

1.5 典型应用场景对比

场景 推荐模型 理由
企业管理系统标准CRUD RBAC 角色清晰,权限固定,改动少
多租户SaaS平台 ABAC(配合RBAC) 通过租户ID隔离数据,粒度更细
文档管理系统,不同部门查看不同机密级别 ABAC 依赖资源密级属性,角色无法表达
微服务API网关鉴权 RBAC + 动态属性 基础用角色,特殊规则用属性
医疗系统,根据医生职称、科室、患者状态控制 ABAC 条件组合复杂,RBAC会爆炸

1.6 选型对比:RBAC vs ABAC

很多同学会问:到底选哪个?我跟你说,没有银弹。我建议这样看:

  • 管理复杂度:RBAC 简单,角色数量可控时非常爽;ABAC 的策略引擎需要设计,学习成本高。
  • 灵活性:ABAC 完胜。一旦业务出现“根据时间、地点、数据内容”动态判断,RBAC 要么加角色(导致角色爆炸),要么硬编码判断。
  • 性能:RBAC 通常快,权限预计算好放缓存;ABAC 每条请求都可能要执行属性解析和策略评估,优化得好也还可以。
  • 审计:RBAC 的审计简单直观——“谁有什么角色”;ABAC 的审计要记录属性快照和策略版本,稍微麻烦。

我曾经踩过的坑: 在一个电商后台,一开始拍脑袋用了纯ABAC,结果业务方天天改属性规则,策略越来越复杂,上线第一天就出bug——某个运营主管因为IP变化被拒绝访问。后来改成“RBAC 兜底 + ABAC 补充”,才稳定下来。说白了,能用角色解决的,别上属性;角色不够用了,再加属性判断。

1.7 知识体系总览

这一章的内容其实挺清晰的。我画了一张图帮你串起来:

权限模型知识体系总览 RBAC(基于角色) ABAC(基于属性) 用户 → 角色 → 权限 角色分层/约束 主体+资源+环境 策略引擎 发展历程 1992年提出 → RBAC0/1/2/3 → XACML标准 → 现代ABAC(NGAC、AWS IAM等) 选型对比要点 ✅ 管理复杂度:RBAC < ABAC ✅ 灵活性:ABAC > RBAC ✅ 性能:RBAC > ABAC ✅ 审计易用性:RBAC > ABAC 💡 实践建议:RBAC兜底 + ABAC补充

1.8 给我的启发

看完这张图你可能会发现:RBAC 和 ABAC 不是对立关系,而是互补关系。现代系统中,往往是混合使用——核心权限用 RBAC 管好,细粒度、动态的业务规则交给 ABAC。

嗯,这一章的内容就到这。记住一点:没有最好的模型,只有最合适的模型。 选型时多问自己一句:“这个权限未来半年会怎么变?”想清楚再动手,能省很多重构的事。