RBAC 模型基础:角色、权限、用户关系

讲 RBAC 之前,我想先聊聊我踩过的一个坑。

几年前做企业内部系统,权限管理直接写死在代码里——if(user.role == "admin") {...}。刚开始就两个角色,挺爽的。后来加了运营、财务、审计,代码变成了 if-else 地狱。更惨的是,有个新业务要调整十多个接口的权限,改了两周,上线当晚就炸了。

从那以后,我再也不敢小看权限模型了。RBAC 这套东西,说白了就是帮我们把「谁」「能干什么」「怎么分的」理清楚。

角色 (Role) —— 权限的集合体

角色不是用户,也不是某个具体功能。

它是一组权限的「打包」。比如「运营专员」这个角色,包含了查看订单、编辑商品、导出报表这些权限。你不需要给每个人单独配权限,给角色就行了。

我个人的习惯:角色命名尽量贴近业务,不要用「Role_001」这种编号。我在项目中见过有人用「GroupA」「GroupB」,半年后没人记得 GroupA 是干啥的,还得翻文档。直接写「财务审核」「客服主管」,一目了然。

权限 (Permission) —— 最小粒度的操作

权限是 RBAC 的原子单位。常见的权限包括:

  • 查看(read)
  • 创建(create)
  • 编辑(update)
  • 删除(delete)
  • 审批(approve)

注意,权限要能和数据范围绑定。比如「编辑订单」这个权限,可能还要区分「编辑自己的订单」还是「编辑所有订单」。这种细粒度我建议用「权限 + 数据范围」组合来实现,后面双人审批部分会专门讲。

用户 (User) —— 赋了角色的活人

用户就是具体的使用者。在 RBAC 里,用户不直接关联权限,而是通过「角色」间接获得权限。

举个例子:

用户A → 角色「财务主管」→ 权限[查看财务报表, 审批报销, 导出账目]
用户B → 角色「财务专员」→ 权限[查看财务报表, 录入报销]

用户 B 没有审批权限,因为它关联的角色就没这个能力。这设计你看得清楚,也容易审计。

三者关系 —— 核心三角

把上面三个概念串起来,就是 RBAC 的经典三角:

概念 本质 一个例子
用户 (User) 系统使用者 张三、李四
角色 (Role) 权限的集合 财务主管、运营经理
权限 (Permission) 最小操作单元 查看订单、删除商品

用户 ↔ 角色 (多对多):一个用户可以有多个角色,一个角色也能属于多个用户。

角色 ↔ 权限 (多对多):一个角色包含多个权限,一个权限也能出现在多个角色里。

用户不直接和权限挂钩,这就是 RBAC 的核心约束。

一句话记牢:用户通过角色获得权限。这个间接层就是 RBAC 灵活性的根基。

下面这张图把关系画清楚了:

RBAC 核心三元组 用户 (User) 角色 (Role) 权限 (Permission) 多对多关联 多对多关联 核心原则 用户不直接绑定权限 用户 → 角色 → 权限 间接层带来灵活性与可审计性
我曾经踩过的坑:有人直接给用户分配权限,绕过了角色层。这会导致权限管理巨混乱——你会发现张三有「删除商品」权限,李四却没有,但两人都是运营角色。后来查了半天,发现是某次紧急上线时直接赋权,忘了走角色。一定要从制度上禁止「裸赋权」,所有权限必须通过角色授予。

RBAC 的优点,为什么要用它?

你想想看,如果没有角色,你要管几百个用户每人都有哪些权限,光维护就疯了。有角色之后:

  • 方便批量调整:修改角色的权限,所有关联用户跟着变。
  • 易于审计:查一个人有什么权限,只需要看他的角色;查一个权限谁在用,看角色下有哪些用户。
  • 权限最小化:可以精细控制每个角色只配必要的权限,避免「Admin 满天飞」。

嗯,这里要注意一个细节:角色不宜太多。我在一个客户项目里见过 200 多个角色,每个角色只有一两个权限。那样角色就退化成「标签」了,失去了聚合的意义。我建议角色数量控制在 20 以内,如果超过 50 个,就该反思是不是把「岗位」和「角色」混了。

一个实际的配置样例

假设我们有个内容管理系统,用户、角色、权限的关联表如下:

用户 角色 关联权限
张编辑 内容编辑 创建文章、编辑草稿、查看已发布
李主编 内容主编 创建文章、编辑草稿、查看已发布、审核发布、撤销发布
王运营 运营专员 查看文章、置顶文章、推荐到首页

你会发现,张编辑和李主编都拥有「创建文章」权限,但李主编多了一个「审核发布」。这个差异是因为他们关联的角色不同,而不是直接在用户上加了标记。这就是 RBAC 的直观好处。

建议:在设计角色时,可以先把「权限字典」梳理出来,按功能模块分组。然后组合成角色。我通常在 Excel 里画一个矩阵:横轴是功能操作,纵轴是角色,标记出哪些操作是必要的。这样设计出来的角色既完整又不冗余。

好了,RBAC 的模型基础差不多就这些。看似简单,但很多项目都栽在「用户直挂权限」或者「角色爆炸」上。后面几章我们会聊 RBAC 与双人审批集成时,怎么处理「谁可以批准」「审批链和角色怎么联动」这些更深的问题——但那是后话,先把基础打扎实再说。