👏 RBAC 权限管理模型
✍️ 作者:桑榆
🕓 更新时间:2025-10-26
🧠 关键词:RBAC权限管理模型
🧩 一、RBAC 是什么?
RBAC 全称 Role-Based Access Control,
翻译过来就是 “基于角色的访问控制”。
一句话解释:
✅ 用户不直接拥有权限,而是通过角色(Role)间接获得权限。
你可以理解为:
“用户 → 扮演 → 角色 → 拥有 → 权限”
🧠 二、核心思想
传统的权限控制是 “用户直接绑定权限”:
text
用户A → 新增菜单权限
用户B → 删除菜单权限但当系统越来越大时,每个用户都要单独维护权限,复杂且容易出错。
RBAC 的思想是中间加一层“角色”:
text
用户A、用户B → 分配角色(管理员、编辑、访客)
每个角色 → 绑定对应的权限(增、删、改、查)这样:
- 新增用户时只要分配角色;
- 修改权限时只改角色;
- 权限控制简单清晰。
🧱 三、RBAC 模型核心结构
RBAC 模型中有 4 个关键实体:
| 实体 | 说明 |
|---|---|
| 👤 用户(User) | 系统中的操作主体,比如员工、管理员 |
| 🧩 角色(Role) | 权限的集合,比如“超级管理员”、“内容编辑” |
| 🔑 权限(Permission) | 对系统资源的具体操作能力,比如“查看菜单”、“删除用户” |
| 📦 资源(Resource) | 权限作用的目标,比如“菜单”、“文章”、“用户管理页” |
关系如下图:
text
User ── 多对多 ── Role ── 多对多 ── Permission ── 多对一 ── Resource通俗理解:
“小明” 是 “管理员” → 管理员能 “编辑用户” → 编辑用户作用于 “用户模块”
🧭 四、RBAC 模型分层版本(从简单到复杂)
🔹 RBAC0:基础模型
最简单的 RBAC。
text
用户 ←→ 角色 ←→ 权限用户通过角色间接获得权限。
这是最常见的结构,适合中小型系统。
🔹 RBAC1:支持角色继承
角色可以继承其他角色的权限。
比如:
text
系统管理员 > 内容管理员 > 普通用户- “系统管理员” 拥有所有权限;
- “内容管理员” 拥有部分权限;
- “普通用户” 拥有基础权限。
这种层级继承让权限复用更方便。
🔹 RBAC2:支持约束(限制规则)
可设置一些约束条件,例如:
- 一个用户不能同时拥有“财务”和“审计”两个角色;
- 某个角色仅在特定部门内可用。
这类“约束规则”让权限体系更安全。
🔹 RBAC3:综合模型
将 RBAC1 + RBAC2 结合使用,
是企业级系统中最完整的权限体系。
⚙️ 五、RBAC 实际数据结构(常见表设计)
| 表名 | 字段 | 说明 |
|---|---|---|
| user | id, username, password | 用户表 |
| role | id, name, description | 角色表 |
| permission | id, name, code, resource | 权限表 |
| user_role | user_id, role_id | 用户与角色的关联表 |
| role_permission | role_id, permission_id | 角色与权限的关联表 |
示例:
| 用户 | 角色 | 权限 |
|---|---|---|
| 小明 | 管理员 | 用户管理、菜单管理 |
| 小红 | 编辑 | 内容发布、内容审核 |
| 小李 | 访客 | 仅查看内容 |
🧩 六、RBAC 权限校验逻辑
1️⃣ 用户登录,后端签发一个带有角色信息的 JWT:
json
{
"userId": "1",
"roles": ["admin", "editor"]
}2️⃣ 前端路由根据角色判断可访问页面:
ts
if (user.roles.includes('admin')) {
showAdminMenu();
}3️⃣ 后端接口权限验证:
ts
function checkPermission(userRoles, requiredRoles) {
return userRoles.some(role => requiredRoles.includes(role));
}4️⃣ 数据库存储角色-权限对应关系,实现统一授权。
