4. RBAC模型:角色定义与权限矩阵、用户-角色-权限三层架构、最小权限原则落地

聊到OA系统的权限设计,RBAC(Role-Based Access Control)是我最常用的模型。说白了,它就是解决「谁可以干什么」这个问题的最经典方案。我在好几个大型企业OA项目里都踩过坑,后来发现,只要把RBAC吃透了,权限这块基本稳了。

4.1 角色定义:别把角色当职位用

很多人一开始容易犯一个错误——把「角色」直接等同于「职位」。比如「经理」、「总监」、「员工」。嗯,这里要注意,角色是权限的集合,不是职级的代名词。

我建议这样定义角色:

  • 按职能划分:比如「报销审批人」、「合同管理员」、「公告发布者」
  • 按操作粒度划分:比如「只读用户」、「编辑用户」、「审核用户」
  • 按数据范围划分:比如「本部门数据查看」、「全公司数据查看」

核心原则:一个角色只做一件事,或者一类紧密相关的事。别搞「超级管理员」这种大而全的角色,除非你真的需要。

我在一个项目中遇到过,客户把「部门经理」定义成一个角色,结果这个角色既要审批请假,又要查看财务报表,还要管理项目进度。后来权限一乱,改都改不动。所以,角色定义一定要细。

4.2 权限矩阵:一张表说清楚所有关系

权限矩阵,说白了就是一张二维表。行是角色,列是资源或操作,交叉点打勾就是「允许」。

举个例子:

角色 创建公告 编辑公告 删除公告 查看公告
公告管理员
普通员工
部门主管

你想想看,这张表一旦画出来,整个系统的权限边界就清晰了。我习惯在项目初期就和业务方一起画这个矩阵,画完基本不会有大改动。

小技巧:权限矩阵可以用Excel维护,但最终要落地到数据库里。我个人喜欢用「位图」的方式存储权限,效率高,扩展也方便。

4.3 用户-角色-权限三层架构

这是RBAC的核心。三层架构的意思是:

  • 用户:具体的人,比如张三、李四
  • 角色:权限的集合,比如「公告管理员」
  • 权限:具体的操作,比如「创建公告」、「删除公告」

用户不直接关联权限,而是通过角色间接获得。这样做的好处是什么?

  1. 解耦:用户变了,权限不用改;权限变了,用户不用动。
  2. 复用:一个角色可以分配给多个用户,省事。
  3. 审计:谁有什么权限,查角色就知道了。

我曾经帮一家公司重构权限系统,他们之前是用户直接挂权限,结果3000个用户,每个用户都有几十条权限记录,改一次要跑半天脚本。改成三层架构后,角色只有20个,维护量直接降了一个数量级。

代码示例(伪代码,但思路清晰):

// 用户表
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

// 角色表
CREATE TABLE roles (
    id INT PRIMARY KEY,
    role_name VARCHAR(50)
);

// 权限表
CREATE TABLE permissions (
    id INT PRIMARY KEY,
    perm_name VARCHAR(50)
);

// 用户-角色关联
CREATE TABLE user_roles (
    user_id INT,
    role_id INT
);

// 角色-权限关联
CREATE TABLE role_permissions (
    role_id INT,
    permission_id INT
);

你看,五张表,搞定。简单吧?但就是这五张表,撑起了整个OA系统的权限体系。

4.4 最小权限原则落地

最小权限原则,说白了就是「给够用的权限,不多给一分」。这个原则说起来简单,落地却不容易。

避坑指南:我曾经在一个项目中,为了省事,给所有新员工都分配了「默认用户」角色,结果这个角色包含了「查看所有人工资」的权限。嗯,后果你懂的。从那以后,我坚持每个角色都要单独审核权限。

落地最小权限原则,我建议这样做:

  • 默认拒绝:所有权限默认关闭,只有明确授权才开放。
  • 按需分配:用户需要什么权限,就只给什么权限,别打包送。
  • 定期审计:每季度检查一次角色和权限,把多余的收回来。
  • 临时权限:对于临时任务,用「临时角色」+「过期时间」来处理。

举个例子,一个实习生只需要查看公告和提交请假,那就只给这两个权限。别因为他是「实习生」就顺手给了「编辑文档」的权限。你想想看,万一他手滑删了重要文件呢?

落地检查清单

  • 每个角色是否只包含必要的权限?
  • 是否有用户拥有超出其职责的权限?
  • 临时权限是否设置了过期时间?
  • 权限变更是否有审批流程?

最后说一句,RBAC不是银弹。如果你的系统特别复杂,比如有几十万个用户、上千种权限,那可能需要考虑ABAC(基于属性的访问控制)。但对于绝大多数OA系统来说,RBAC足够用了。我做了这么多年,90%的项目都是用RBAC搞定的。

嗯,这一节就到这里。记住:角色定义要细,权限矩阵要清,三层架构要稳,最小权限要狠。做到这四点,你的OA系统权限基本不会出大问题。