1. RBAC 是什么?
RBAC(Role-Based Access Control,基于角色的访问控制) 是一种广泛使用的权限管理模型,它通过 “角色” 作为中间层,将 用户 和 权限 解耦,实现灵活、高效的权限管理。
- 核心思想:
- 用户不直接拥有权限,而是通过 角色 间接获得权限。
- 角色 是权限的集合,用户 是角色的集合。
- 通过分配角色给用户,实现权限控制。
简单来说,就是用户与角色进行绑定,角色与权限进行绑定,这样就解决了每创建一个用户不再是去创建一个新的权限表,而是将用户与角色进行绑定,减少了代码与思维逻辑上的冗余;
2.RBAC 的核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| 用户(User) | 系统的使用者(如员工、客户) | 张三(员工)、李四(管理员) |
| 角色(Role) | 权限的集合(如“管理员”、“普通用户”) | admin、editor、viewer |
| 权限(Permission) | 对资源的操作(如“读取文件”、“删除订单”) | read:article、delete:order |
| 资源(Resource) | 系统中的对象(如文章、订单、用户) |
|
3. RBAC 的基本模型
RBAC 通常分为 RBAC0(基础模型)、RBAC1(角色继承)、RBAC2(约束)、RBAC3(混合模型),企业级系统一般使用 RBAC0 + RBAC1。
(1) RBAC0(基础模型)
- 用户 → 角色 → 权限 的三级结构。
- 用户通过角色获得权限,权限直接绑定到角色。
- 示例:
- 角色
admin拥有create:user、delete:user权限。 - 用户
张三被分配admin角色,因此拥有create:user和delete:user权限。
- 角色
(2) RBAC1(角色继承)
- 角色可以 继承 其他角色的权限(类似面向对象的继承)。
- 示例:
- 角色
senior_editor继承editor的所有权限,并额外拥有publish:article权限。 - 用户
李四被分配senior_editor角色,因此拥有editor的所有权限 +publish:article。
- 角色
(3) RBAC2(约束)
- 增加 约束条件,如:
- 互斥角色:一个用户不能同时拥有
审核员和申请人角色(避免利益冲突)。 - 基数约束:一个用户最多只能拥有 3 个角色。
- 先决条件角色:必须先拥有
初级编辑才能升级为高级编辑。
- 互斥角色:一个用户不能同时拥有
(4) RBAC3(混合模型)
- 结合 RBAC1(角色继承) 和 RBAC2(约束),适用于复杂系统。
4. RBAC 的优势
| 优势 | 说明 |
|---|---|
| 解耦用户和权限 | 用户不直接绑定权限,而是通过角色间接获得权限,便于管理。 |
| 灵活的角色分配 | 可以动态调整角色权限,无需修改用户权限。 |
| 支持角色继承 | 减少重复配置,提高管理效率。 |
| 便于审计 | 权限变更只需调整角色,便于追踪权限分配情况。 |
| 适用于大规模系统 | 可以轻松扩展到成千上万的用户和权限。 |
5. RBAC 的典型应用场景
- 企业管理系统(如 OA、ERP)
admin(管理员)、manager(部门经理)、employee(普通员工)。
- 内容管理系统(CMS)
editor(编辑)、publisher(发布者)、viewer(查看者)。
- 云服务平台(如 AWS、阿里云)
superuser(超级管理员)、developer(开发者)、auditor(审计员)。
- 数据库权限管理
db_admin(数据库管理员)、db_reader(只读用户)。
6. RBAC 的实现方式
(1) 数据库设计(以 MySQL 为例)
| 表名 | 字段 | 说明 |
|---|---|---|
users | id, name | 用户表 |
roles | id, name | 角色表 |
permissions | id, name, resource, action | 权限表 |
user_roles | user_id, role_id | 用户-角色关联表 |
role_permissions | role_id, permission_id | 角色-权限关联表 |
(2) 代码实现(伪代码)
# 1. 定义用户、角色、权限
user = User("张三")
role = Role("admin", permissions=["create:user", "delete:user"])
permission = Permission("delete:user", resource="user", action="delete")
# 2. 分配角色给用户
user.assign_role(role)
# 3. 检查用户是否有权限
if user.has_permission("delete:user"):
print("允许删除用户")
else:
print("无权操作")
(3) 现代框架支持
- Spring Security(Java):支持 RBAC 权限控制。
- Django Permissions(Python):内置 RBAC 模型。
- Casbin(多语言支持):专门用于 RBAC 和 ABAC 的权限框架。
7. RBAC vs ABAC(对比)
| 对比项 | RBAC | ABAC |
|---|---|---|
| 核心 | 基于角色 | 基于属性(用户、资源、环境等) |
| 灵活性 | 中等(依赖角色定义) | 高(可动态计算权限) |
| 适用场景 | 企业级固定角色系统 | 复杂动态权限系统(如 IoT、金融) |
| 复杂度 | 低 | 高 |
RBAC 适用于:
- 角色固定、权限变化较少的系统(如企业 OA)。
ABAC 适用于:
- 权限需要动态计算(如“仅允许财务部员工在上班时间访问工资数据”)。
8. 总结
- RBAC 是一种成熟、高效的权限管理模型,适用于大多数企业级系统。
- 核心是“用户→角色→权限”,通过角色解耦用户和权限,提高管理灵活性。
- 支持角色继承和约束,适用于复杂业务场景。
- 现代框架(如 Spring Security、Casbin)已内置 RBAC 支持,开发成本低。
如果你的系统需要 固定角色、清晰权限划分,RBAC 是最佳选择!
509

被折叠的 条评论
为什么被折叠?



