1. 权限模型基础:RBAC 模型介绍、用户-角色-权限关系、最小权限原则

做配方管理系统,权限这块要是没想清楚,后面全是坑。我见过太多项目,上线后才发现「这个操作员不该看到那个配方」、「这个工艺员居然能删别人的配方」——说白了,就是一开始没把权限模型搭好。

这一章,咱们先把地基打牢。我会从 RBAC 模型讲起,把用户、角色、权限这三者的关系理清楚,再聊聊最小权限原则。这些都是我实际项目中反复踩过的坑,希望能帮你少走弯路。

1.1 什么是 RBAC 模型?

RBAC,全称 Role-Based Access Control,基于角色的访问控制。这玩意儿不是新概念,90 年代就提出来了,但直到今天,它依然是企业级权限管理的主流方案。

为什么这么流行?你想想看,一个工厂可能有几百个操作员,如果每个操作员都单独配置权限,那管理员得累死。RBAC 的思路很简单:把权限分配给角色,再把角色分配给用户。这样,你只需要管理角色,而不是管理每个用户。

核心思想:用户 → 角色 → 权限,三层结构,层层解耦。

我在一个化工配方项目里就吃过亏。一开始图省事,直接给每个用户配权限,结果配方员离职后,他的权限没人知道怎么回收,最后只能 DBA 直接删库。嗯,从那以后,我再也不敢绕过 RBAC 了。

1.2 用户-角色-权限关系

这三者的关系,我用一张图来展示。这张 SVG 图是我自己画的,把核心逻辑都标出来了。

用户-角色-权限关系图 用户-角色-权限关系图 用户 (User) 操作员 A 工艺员 B 质检员 C 角色 (Role) 配方操作员 配方工艺员 配方审核员 权限 (Permission) 查看配方 编辑配方 删除配方 分配 关联 💡 用户通过角色获得权限,一个用户可以有多个角色,一个角色也可以有多个用户。 权限是原子操作,角色是权限的集合,用户是角色的载体。 典型流程: 创建角色 分配权限 关联用户 生效

这张图你看懂了吗?用户不直接跟权限打交道,而是通过角色这个中间层。这样做的好处很明显:

  • 简化管理:角色数量远少于用户数量,管理成本直线下降
  • 灵活调整:用户换岗,只需要换角色,不用重新配权限
  • 审计清晰:谁有什么权限,通过角色一目了然

我的经验:角色命名要规范。我习惯用「岗位+职能」的方式,比如「配方_操作员」、「配方_工艺员」。别用「admin」、「user」这种模糊的名字,半年后你自己都看不懂。

1.3 权限的粒度

权限不是越细越好,也不是越粗越好。这里有个平衡点。我一般把权限分为三个层级:

层级 说明 配方管理中的例子
功能权限 能否访问某个功能模块 能否进入「配方管理」页面
操作权限 能对数据做什么操作 查看、新增、编辑、删除、审核
数据权限 能看到哪些数据 只能看本车间的配方,不能看其他车间的

在配方管理系统里,数据权限尤其重要。同一个配方,操作员只能看,工艺员能改,审核员能批——这就是操作权限的差异。而不同车间的配方互相隔离,这就是数据权限在起作用。

注意:数据权限是最容易被忽略的。我曾经有个项目,功能权限和操作权限都配好了,结果上线后发现,一个车间的操作员能看到另一个车间的配方。原因就是数据权限没做隔离。这个坑,我替你们踩过了。

1.4 最小权限原则

最小权限原则,英文叫 Principle of Least Privilege,简称 PoLP。意思很简单:给用户刚刚好的权限,不多给一分。

为什么要有这个原则?你想想看,如果一个操作员有删除配方的权限,他手滑点错了怎么办?如果一个工艺员有审核权限,他给自己审核通过了怎么办?权限越大,风险越大。

我总结了几条落地经验:

  1. 默认拒绝:所有权限默认关闭,只开放必要的
  2. 按需分配:用户需要什么权限,就给什么权限,不要图省事给一大包
  3. 定期审计:每季度检查一次权限,回收不再需要的权限
  4. 临时授权:临时需要的权限,设置有效期,到期自动回收

核心原则:权限不是越多越好,而是越精确越好。给多了是风险,给少了是障碍,刚刚好才是高手。

我记得有一次,一个工厂的质检员需要临时查看某个配方的历史版本。按流程,他应该申请临时权限。但管理员嫌麻烦,直接给了他「配方管理员」的角色。结果这个质检员不小心把配方版本回退了,导致生产线停了两小时。嗯,这就是违反最小权限原则的代价。

1.5 配方管理中的 RBAC 落地

好了,理论讲完了,咱们看看在配方管理系统里怎么落地。我画了一个简单的角色-权限矩阵,你可以参考:

角色 查看配方 新增配方 编辑配方 删除配方 审核配方 管理用户
配方操作员 ✅ ❌ ❌ ❌ ❌ ❌
配方工艺员 ✅ ✅ ✅ ❌ ❌ ❌
配方审核员 ✅ ❌ ❌ ❌ ✅ ❌
配方管理员 ✅ ✅ ✅ ✅ ✅ ❌
系统管理员 ✅ ✅ ✅ ✅ ✅ ✅

你看,每个角色的权限都是精心设计的。操作员只能看,工艺员能增改但不能删,审核员只能审核不能改——这就是职责分离,也是最小权限原则的体现。

一个小技巧:在数据库设计时,我习惯把权限用位图或者字符串掩码来表示。比如「查看=1,新增=2,编辑=4,删除=8,审核=16」,这样角色的权限就是一个数字,判断时用位运算,性能很好。代码示例:

-- 权限定义(位掩码)
const PERM_VIEW   = 1;  // 00001
const PERM_CREATE = 2;  // 00010
const PERM_EDIT   = 4;  // 00100
const PERM_DELETE = 8;  // 01000
const PERM_AUDIT  = 16; // 10000

-- 工艺员权限:查看 + 新增 + 编辑 = 1+2+4 = 7
-- 判断是否有编辑权限:7 & 4 === 4 → true
-- 判断是否有删除权限:7 & 8 === 0 → false

好了,这一章的内容就是这些。RBAC 模型、用户-角色-权限关系、最小权限原则,这三个概念是后面所有章节的基础。你先把它们吃透,后面讲权限配置、权限校验、权限审计的时候,你会觉得特别顺。