RBAC权限控制系统

RBAC(Role-Based Access Control,基于角色的访问控制)是一种通过角色来管理用户访问权限的模型。它的核心思想是将权限分配给角色,再将角色分配给用户,用户通过扮演角色来获得相应的权限。

下面这个表格可以帮你快速抓住RBAC的核心组成部分:

核心组件 说明 生活中的类比
用户 (User) 系统的使用者,如员工、管理员等。 公司里的员工
角色 (Role) 一组权限的集合,代表特定的职责或岗位,如“经理”、“财务”。 员工所在的职位,如“部门经理”
权限 (Permission) 对特定资源(如文件、数据)可执行的操作(如读、写、删)。 该职位被允许处理的工作内容,如“审批10万元以下预算”
会话 (Session) 用户登录系统后建立的临时上下文,用于激活其拥有的角色。 员工在工作时间内履行其职责

RBAC的不同模型

基础的RBAC模型(也称为RBAC0)包含了上述所有核心组件。为了满足更复杂的管理需求,RBAC还衍生出几个扩展模型:

  • RBAC1(角色分层模型):引入了角色继承概念。子角色可以继承父角色的所有权限,这类似于现实中的职位层级,例如“高级经理”会自动拥有“经理”的所有权限,并且可能还有额外权限。
  • RBAC2(约束模型):增加了各种约束规则来提高安全性,主要包括:
    • 静态职责分离 (SSD):防止用户被授予互斥的角色,比如同一个人不能既当“会计”又当“出纳”。
    • 动态职责分离 (DSD):允许用户拥有多个角色,但在一次登录会话中只能激活其中一个。
    • 基数约束:限制一个角色能分配的用户数量,或一个用户能拥有的角色数量。
  • RBAC3(统一模型):这是最完整的模型,同时包含了RBAC1的角色继承和RBAC2的约束机制

RBAC的优势与适用场景

采用RBAC模型主要能带来以下几点好处:

  • 简化管理:当需要修改一批用户的权限时,只需调整他们角色所关联的权限即可,无需逐个修改用户设置,大大降低了管理复杂度和出错概率。
  • 提升安全:遵循最小权限原则,即每个角色只被授予完成其工作所必需的最小权限,减少了因权限过度分配带来的安全风险。
  • 支持审计与合规:权限的分配路径(用户-角色-权限)非常清晰,便于审查和满足合规性要求。

因此,RBAC非常适合用于企业内部信息系统(如ERP、CRM)、云服务平台(如AWS、Kubernetes)以及多租户应用等需要对用户权限进行清晰、灵活管理的场景。

实际应用的一点提示

虽然RBAC的理论模型看起来可能有些复杂,但在实际系统设计中,RBAC0(基础模型)已经能够满足绝大多数中小型项目的需求。你可以先从实现“用户-角色-权限”这三张核心表以及它们之间的关系表开始。只有当你的系统确实存在明确的角色层级(如军队、大型集团的严格等级)或需要严格的职责分离(如金融系统的风控要求)时,才需要考虑引入RBAC1或RBAC2的复杂特性。

一个简单的RBAC表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-- 当前流行的权限控制系统 RBAC 模式,所以数据库表设计基于 RBAC

-- 创建数据库
CREATE DATABASE rbac DEFAULT CHARACTER SET utf8;

-- 用户表
CREATE TABLE user(
user_id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID主键',
phone VARCHAR(50) NOT NULL UNIQUE COMMENT '手机号,唯一',
password VARCHAR(255) NOT NULL COMMENT '密码',
username VARCHAR(100) NOT NULL COMMENT '用户名'
)AUTO_INCREMENT=1000 DEFAULT charset=utf8 COMMENT='用户表';
-- 角色表
CREATE TABLE role(
role_id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID主键',
role_name VARCHAR(100) NOT NULL COMMENT '角色名'
)AUTO_INCREMENT=1000 DEFAULT charset=utf8 COMMENT='角色表';
-- 权限表
CREATE TABLE permission(
permission_id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '权限ID主键',
permission_name VARCHAR(100) NOT NULL COMMENT '权限名'
)AUTO_INCREMENT=1000 DEFAULT charset=utf8 COMMENT='权限表';
-- 用户角色关联表
CREATE TABLE user_role(
user_id BIGINT NOT NULL COMMENT '用户ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
PRIMARY KEY (user_id,role_id)
) DEFAULT charset=utf8 COMMENT='用户角色关联表';
-- 角色权限关联表
CREATE TABLE role_permission(
role_id BIGINT NOT NULL COMMENT '角色ID',
permission_id BIGINT NOT NULL COMMENT '权限ID',
PRIMARY KEY (role_id,permission_id)
) DEFAULT charset=utf8 COMMENT='角色权限关联表';