4. RBAC模型:角色定义与权限矩阵、用户-角色-权限三层架构、最小权限原则落地
聊到OA系统的权限设计,RBAC(Role-Based Access Control)是我最常用的模型。说白了,它就是解决「谁可以干什么」这个问题的最经典方案。我在好几个大型企业OA项目里都踩过坑,后来发现,只要把RBAC吃透了,权限这块基本稳了。
4.1 角色定义:别把角色当职位用
很多人一开始容易犯一个错误——把「角色」直接等同于「职位」。比如「经理」、「总监」、「员工」。嗯,这里要注意,角色是权限的集合,不是职级的代名词。
我建议这样定义角色:
- 按职能划分:比如「报销审批人」、「合同管理员」、「公告发布者」
- 按操作粒度划分:比如「只读用户」、「编辑用户」、「审核用户」
- 按数据范围划分:比如「本部门数据查看」、「全公司数据查看」
核心原则:一个角色只做一件事,或者一类紧密相关的事。别搞「超级管理员」这种大而全的角色,除非你真的需要。
我在一个项目中遇到过,客户把「部门经理」定义成一个角色,结果这个角色既要审批请假,又要查看财务报表,还要管理项目进度。后来权限一乱,改都改不动。所以,角色定义一定要细。
4.2 权限矩阵:一张表说清楚所有关系
权限矩阵,说白了就是一张二维表。行是角色,列是资源或操作,交叉点打勾就是「允许」。
举个例子:
| 角色 | 创建公告 | 编辑公告 | 删除公告 | 查看公告 |
|---|---|---|---|---|
| 公告管理员 | ✅ | ✅ | ✅ | ✅ |
| 普通员工 | ❌ | ❌ | ❌ | ✅ |
| 部门主管 | ✅ | ✅ | ❌ | ✅ |
你想想看,这张表一旦画出来,整个系统的权限边界就清晰了。我习惯在项目初期就和业务方一起画这个矩阵,画完基本不会有大改动。
小技巧:权限矩阵可以用Excel维护,但最终要落地到数据库里。我个人喜欢用「位图」的方式存储权限,效率高,扩展也方便。
4.3 用户-角色-权限三层架构
这是RBAC的核心。三层架构的意思是:
- 用户:具体的人,比如张三、李四
- 角色:权限的集合,比如「公告管理员」
- 权限:具体的操作,比如「创建公告」、「删除公告」
用户不直接关联权限,而是通过角色间接获得。这样做的好处是什么?
- 解耦:用户变了,权限不用改;权限变了,用户不用动。
- 复用:一个角色可以分配给多个用户,省事。
- 审计:谁有什么权限,查角色就知道了。
我曾经帮一家公司重构权限系统,他们之前是用户直接挂权限,结果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系统权限基本不会出大问题。