RBAC 权限系统设计与实现

1. RBAC 是什么

RBAC(Role-Based Access Control:基于角色的访问控制)

简单来说,就是通过将权限分配给角色,再把角色分配给用户,来实现对系统资源的访问控制。一个用户拥有若干角色,每个角色拥有若干权限。这样就构造成“用户-角色-权限”的授权模型。在这种模型中,**用户与角色,角色与权限之间,一般是多对多的关系。**具体而言,RBAC 模型定义了一下几个核心概念。

  1. 角色(Role):角色是指在系统中具有一组相关权限的抽象概念,代表了用户在特定上下文中的身份和职能,例如 管理员、普通用户等。
  2. 权限(Permission):权限是指对系统资源进行操作的许可,如读取、写入、修改等。权限可以分配给角色。
  3. 用户(User):用户是指系统的实际使用者,每个用户可以分配一个或多个角色。
  4. 分配(Assignment):分配是指将角色与用户关联起来,以赋予用户相关的权限。

RBAC 认为授权实际上是 Who、What、How 三元组之间的关系,也就是 Who 对 What 进行 How 的操作。

Who:是权限的拥有者或主体(如:User,Role)。

What:是操作或对象(operation,object)。

How:具体的权限(Privilege,正向授权与负向授权)。

通过 RBAC 模型,可以实现灵活且易于管理的访问控制策略。管理员可以通过分配和调整角色,来管理用户的权限。这种角色层次结构可以帮助简化权限管理,并确保用户只有所需的权限。

RBAC 模型广泛应用于系统安全、数据库管理、网络管理等领域,它提供了一种可扩展、可管理的访问控制机制,有助于保护系统资源免受未经授权的访问和潜在的安全威胁。

2. 为什么要使用 RBAC 模型?

当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。

在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。

RBAC 权限设计:

img_d55912967bd28f3392f56bd216392ec3.png

3. RBAC 的适用场景

(1)企业组织架构:在企业中,RBAC 可用于根据员工的职位、角色和职责来管理访问权限。不同部门的员工可以被分配到不同的角色,以便根据其工作职能限制他们对系统和资源的访问。

(2)应用程序和系统访问控制:RBAC 可用于管理应用程序和系统中的用户访问权限。管理员可以根据用户的角色将其分配到适当的角色,并定义角色的权限集合。这样,系统可以确保用户只能访问其所需的功能和数据,从而提高安全性。

(3)多租户系统:在多租户环境中,RBAC 模型可以用于对不同租户之间的访问进行隔离和管理。每个租户可以有自己的角色和权限定义,以确保其数据和资源只能被其授权的用户访问。

(4)医疗保健:在医疗保健领域,RBAC 可用于管理医生、护士和管理员等不同角色的访问权限。例如,医生可以被分配到具有病人记录和处方访问权限的角色,而护士只能访问病人记录。

(5)金融和银行:在金融和银行领域,RBAC 可用于管理不同用户角色的访问权限,例如客户、经理和审计人员。通过 RBAC,可以确保客户只能访问其自己的账户信息,而经理和审计人员可以拥有更广泛的访问权限。

(6)云计算和网络服务提供商:RBAC 可用于管理云计算平台和网络服务提供商中的用户访问权限。不同用户可以被分配到不同的角色,以限制其对云资源、虚拟机或网络设备的操作。

RBAC 模型可以应用于各种不同的领域和系统,以提供更安全、灵活和可管理的访问控制机制。根据特定的需求和环境,可以根据 RBAC 模型进行定制和扩展。

4. RBAC 流程图

image-20250318233043131

5. 相关表结构

rbac_user 用户

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
CREATE TABLE
IF
NOT EXISTS `rbac_user` (
`id` BIGINT (20) NOT NULL COMMENT '主键',
`version` INT (11) NOT NULL DEFAULT '0' COMMENT '乐观锁',
`create_by` VARCHAR (32) DEFAULT NULL COMMENT '创建人',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` VARCHAR (32) DEFAULT NULL COMMENT '更新人',
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` INT (11) NOT NULL DEFAULT '0' COMMENT '删除标识',
`app` BIGINT (20) DEFAULT NULL COMMENT '应用编号',
`app_inst` BIGINT (20) DEFAULT NULL COMMENT '应用实例编号',
`mobile` VARCHAR (225) DEFAULT NULL COMMENT '手机号码',
`email` VARCHAR (225) DEFAULT NULL COMMENT '邮箱',
`login_name` VARCHAR (64) DEFAULT NULL COMMENT '登录名',
`password` VARCHAR (225) DEFAULT NULL COMMENT '密码',
`status` INT (11) NOT NULL DEFAULT '0' COMMENT '状态',
`name` VARCHAR (225) DEFAULT NULL COMMENT '姓名',
`salt` VARCHAR (16) DEFAULT NULL COMMENT '账号密码盐',
`first_login` INT (1) DEFAULT NULL COMMENT '首次登录',
`nick_name` VARCHAR (255) DEFAULT NULL COMMENT '昵称',
`id_card` VARCHAR (225) DEFAULT NULL COMMENT '身份证号',
`sex` INT (1) DEFAULT NULL COMMENT '性别',
`admin` VARCHAR (10) DEFAULT NULL COMMENT '管理员标志',
PRIMARY KEY (`id`),
KEY `mobile` (`mobile`),
KEY `nameIndex` (`name`),
KEY `loginNameIndex` (`login_name`)) COMMENT = '用户表';

rbac_role 角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE
IF
NOT EXISTS `rbac_role` (
`id` BIGINT (20) NOT NULL COMMENT '主键',
`version` INT (11) DEFAULT NULL COMMENT '乐观锁',
`create_by` VARCHAR (32) DEFAULT NULL COMMENT '创建人',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_by` VARCHAR (32) DEFAULT NULL COMMENT '更新人',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
`deleted` INT (11) DEFAULT NULL COMMENT '删除标识',
`code` VARCHAR (32) DEFAULT NULL COMMENT '角色编码',
`description` VARCHAR (128) DEFAULT NULL COMMENT '角色描述',
`status` VARCHAR (32) DEFAULT NULL COMMENT '状态',
`admin` INT (11) DEFAULT NULL COMMENT '管理员标志',
`name` VARCHAR (64) DEFAULT NULL COMMENT '角色名称',
PRIMARY KEY (`id`)) COMMENT = '角色表';

rbac_resource 资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE
IF
NOT EXISTS `u_resource` (
`id` BIGINT (64) NOT NULL COMMENT '主键',
`version` INT (11) DEFAULT NULL COMMENT '乐观锁',
`create_by` VARCHAR (32) DEFAULT NULL COMMENT '创建人',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_by` VARCHAR (32) DEFAULT NULL COMMENT '更新人',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
`deleted` INT (11) DEFAULT NULL COMMENT '删除标识',
`app_id` BIGINT (20) DEFAULT NULL COMMENT '应用编号',
`code` VARCHAR (255) DEFAULT NULL COMMENT '资源编码',
`type` INT (11) DEFAULT '1' COMMENT '类型',
`name` VARCHAR (32) DEFAULT NULL COMMENT '名称',
`menu_type` VARCHAR (2) DEFAULT NULL COMMENT '菜单类型,1:普通菜单 2:内嵌菜单 3:外链菜单',
`menu_target_address` VARCHAR (255) DEFAULT NULL COMMENT '菜单目标地址',
`parent_id` BIGINT (20) DEFAULT NULL COMMENT '父级编码',
`route_path` VARCHAR (500) DEFAULT NULL COMMENT '跳转路径',
`sort_no` INT (11) DEFAULT NULL COMMENT '序号',
`description` VARCHAR (300) DEFAULT NULL COMMENT '说明',
`status` VARCHAR (32) DEFAULT NULL COMMENT '状态',
`is_new_open_windows` TINYINT (1) DEFAULT NULL COMMENT '是否新窗口打开',
`resources_api` VARCHAR (256) DEFAULT NULL COMMENT '授权接口.防越权',
PRIMARY KEY (`id`)) COMMENT = '资源表';

rbac_Identification 身份(用户角色)

rbac_role_resouce 角色资源