第二章 RBAC 模型核心概念:角色、权限、用户、会话

RBAC 听着玄乎,其实拆开看就四个东西——用户、角色、权限、会话。我当年第一次接触 RBAC,看文档看得头大,后来发现核心就是一句话:用户通过角色获得权限,会话控制激活范围。咱们这一章就把这四个概念掰开揉碎,再画一张关系图,让你一次性吃透。

2.1 四大核心元素

2.1.1 用户(User)

用户就是系统中的操作主体,可以是一个人、一个服务账号、甚至一个外部系统。说白了,谁在干活,谁就是用户。

我的经验:很多项目把「用户」直接对应到自然人,其实不对。一个运维人员可能有三个账号:日常操作、审计、紧急变更。三套账号就是三个 User 实体,这在 RBAC 里是完全独立的。

2.1.2 角色(Role)

角色是 RBAC 的精髓。你想想看,如果我们给每个用户单独分配权限,1000 个用户就得管 1000 份权限表,谁受得了?角色就是「权限的集合体」,比如「管理员」「审计员」「操作员」。我们把权限绑定到角色上,再把角色分配给用户。

我早期犯过一个错:把角色设计成岗位名称,比如「运维总监」「值班工程师」。后来发现一个人调岗就得重建角色。正确的做法是——角色对应权限粒度,不对应职位。「日志查看员」「配置修改员」这种才是好角色。

2.1.3 权限(Permission)

权限就是「能不能做某件事」。标准 RBAC 里,权限通常拆成两部分:资源 + 操作。

  • 资源:你要碰的东西,比如「订单表」「用户列表」「配置文件」
  • 操作:你对它干什么,比如「增、删、改、查、导出」

举个例子,「删除订单」这条权限 = 资源「订单」 + 操作「删除」。我在项目里喜欢把权限写成 resource:action 的格式,比如 order:delete,清晰又方便做自动化校验。

2.1.4 会话(Session)

会话是很多人忽略的点。用户登录系统后,会创建一个会话。在 RBAC 里,会话的作用是限制角色在本次登录中是否生效。一个用户可能有「管理员」和「普通用户」两个角色,但他登录时可以选择只激活「普通用户」角色,这就是最小权限原则的具体落地。

避坑指南:我曾经给一个金融系统做 RBAC 设计,忘了考虑会话级角色激活。结果审计时发现,管理员平时用高权限角色浏览网页,一个 XSS 就丢了全库。后来强制要求:每次登录只能激活一个角色,且默认激活最低权限角色。这东西看着小,出事就是大事。

2.2 核心关系图

下面这张图,把这四个元素串起来了。我建议你多看两遍,理解箭头的方向——它代表了 RBAC 的约束流向。

RBAC 核心元素关系图 👤 用户 User 🎭 角色 Role 🔑 权限 Permission 🔗 会话 Session 分配 授权 创建 激活 选择激活 📌 关键约束 一个用户可以拥有多个角色,但每个会话只能激活该用户被分配的角色子集。

2.3 基本关系与约束

上面的图里,你能看到三条主要关系线:

  1. 用户 ↔ 角色:多对多。一个用户可以有多个角色,一个角色也可以赋予多个用户。
  2. 角色 ↔ 权限:也是多对多。一个角色包含多个权限,一个权限可以出现在多个角色里。
  3. 会话 ↔ 角色:一对多。一个会话可以激活多个角色,但只能从用户已有的角色集合里选。
核心原则:用户不能直接拥有权限,必须通过角色间接获得。这叫「权限与用户解耦」——你换了个用户,只要角色不变,权限就不变。

2.4 实践中的角色设计误区

我见过太多团队把 RBAC 做成了「用户权限管理工具」,完全丢了角色这个抽象层。这里列几个常见坑:

错误做法 后果 正确做法
按岗位名称定义角色 人员调岗需重建角色 按操作粒度定义角色,如「只读用户」「导出专员」
一个用户一个专属角色 角色数量爆炸,失去复用意义 提炼公共角色,用会话控制激活范围
权限直接挂到用户上 后期审计和变更全乱套 永远是 用户 → 角色 → 权限 三层结构

2.5 会话管理的一个真实教训

讲个真事。我之前负责一个后台管理系统,上线半年一直没问题。直到有一次安全扫描发现:一个普通运维用他的账号登录后,竟然能通过切换角色拿到管理员权限。

查了一周,原因出在会话层——我们的 RBAC 实现里,用户登录后把所有角色都塞进了会话,前端页面只是把高权限按钮隐藏了,但后端接口没做二次校验。攻击者直接调 API,角色就生效了。

教训:会话是 RBAC 的边界守卫。我的铁律是——会话创建时只激活默认最低权限角色,用户需要提权时必须二次认证。这个机制在今天几乎所有企业级系统里都能看到,比如 AWS 的 AssumeRole 就是类似的思路。

2.6 核心元素速查表

最后,我给你一张速查表,方便以后复习或者做方案时快速翻阅:

元素 英文 一句话定义 我常用的别名
用户 User 操作主体,可以是人或服务 账号、主体
角色 Role 权限的集合,用户与权限的桥梁 角色模板、权限组
权限 Permission 资源 + 操作,定义能不能做某事 权限点、动作
会话 Session 登录后的临时上下文,控制角色激活 登录态、上下文