RBAC 权限系统设计与实现
1. RBAC 是什么
RBAC(Role-Based Access Control:基于角色的访问控制)
简单来说,就是通过将权限分配给角色,再把角色分配给用户,来实现对系统资源的访问控制。一个用户拥有若干角色,每个角色拥有若干权限。这样就构造成“用户-角色-权限”的授权模型。在这种模型中,**用户与角色,角色与权限之间,一般是多对多的关系。**具体而言,RBAC 模型定义了一下几个核心概念。
- 角色(Role):角色是指在系统中具有一组相关权限的抽象概念,代表了用户在特定上下文中的身份和职能,例如 管理员、普通用户等。
- 权限(Permission):权限是指对系统资源进行操作的许可,如读取、写入、修改等。权限可以分配给角色。
- 用户(User):用户是指系统的实际使用者,每个用户可以分配一个或多个角色。
- 分配(Assignment):分配是指将角色与用户关联起来,以赋予用户相关的权限。
RBAC 认为授权实际上是 Who、What、How 三元组之间的关系,也就是 Who 对 What 进行 How 的操作。
Who:是权限的拥有者或主体(如:User,Role)。
What:是操作或对象(operation,object)。
How:具体的权限(Privilege,正向授权与负向授权)。
通过 RBAC 模型,可以实现灵活且易于管理的访问控制策略。管理员可以通过分配和调整角色,来管理用户的权限。这种角色层次结构可以帮助简化权限管理,并确保用户只有所需的权限。
RBAC 模型广泛应用于系统安全、数据库管理、网络管理等领域,它提供了一种可扩展、可管理的访问控制机制,有助于保护系统资源免受未经授权的访问和潜在的安全威胁。
2. 为什么要使用 RBAC 模型?
当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。
在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。
RBAC 权限设计:

3. RBAC 的适用场景
(1)企业组织架构:在企业中,RBAC 可用于根据员工的职位、角色和职责来管理访问权限。不同部门的员工可以被分配到不同的角色,以便根据其工作职能限制他们对系统和资源的访问。
(2)应用程序和系统访问控制:RBAC 可用于管理应用程序和系统中的用户访问权限。管理员可以根据用户的角色将其分配到适当的角色,并定义角色的权限集合。这样,系统可以确保用户只能访问其所需的功能和数据,从而提高安全性。
(3)多租户系统:在多租户环境中,RBAC 模型可以用于对不同租户之间的访问进行隔离和管理。每个租户可以有自己的角色和权限定义,以确保其数据和资源只能被其授权的用户访问。
(4)医疗保健:在医疗保健领域,RBAC 可用于管理医生、护士和管理员等不同角色的访问权限。例如,医生可以被分配到具有病人记录和处方访问权限的角色,而护士只能访问病人记录。
(5)金融和银行:在金融和银行领域,RBAC 可用于管理不同用户角色的访问权限,例如客户、经理和审计人员。通过 RBAC,可以确保客户只能访问其自己的账户信息,而经理和审计人员可以拥有更广泛的访问权限。
(6)云计算和网络服务提供商:RBAC 可用于管理云计算平台和网络服务提供商中的用户访问权限。不同用户可以被分配到不同的角色,以限制其对云资源、虚拟机或网络设备的操作。
RBAC 模型可以应用于各种不同的领域和系统,以提供更安全、灵活和可管理的访问控制机制。根据特定的需求和环境,可以根据 RBAC 模型进行定制和扩展。
4. RBAC 流程图

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 角色资源