关于RBAC
**RBAC** = **R**ole **B**ased **A**ccess **C**ontrol(基于角色的访问控制)
RBAC是经典的用户权限管理的设计思路。在这样的设计中,会存在3种类型:用户、角色、权限,权限将分配到各种角色上,用户可以关联某种角色,进而实现用户与权限相关。使用这样的设计,更加利于统一管理若干个用户的权限。
在RBAC的设计思路中,用户与角色一般是多对多的关系,而在数据库中,仅仅只是使用“用户”和“角色”这2张表是不利于维护多对多关系的,通常会增加一张中间表,专门记录对应关系,同理,角色和权限也是多对多的关系,也需要使用中间表来记录对应关系!
关于这些表的设计参考如下:
admin:管理员表**
-- 管理员表:创建数据表
drop table if exists ams_admin;
create table admin (id bigint unsigned auto_increment,username varchar(50) default null unique comment '用户名',password char(64) default null comment '密码(密文)',nickname varchar(50) default null comment '昵称',avatar varchar(255) default null comment '头像URL',phone varchar(50) default null unique comment '手机号码',email varchar(50) default null unique comment '电子邮箱',description varchar(255) default null comment '描述',is_enable tinyint unsigned default 0 comment '是否启用,1=启用,0=未启用',last_login_ip varchar(50) default null comment '最后登录IP地址(冗余)',login_count int unsigned default 0 comment '累计登录次数(冗余)',gmt_last_login datetime default null comment '最后登录时间(冗余)',gmt_create datetime default null comment '数据创建时间',gmt_modified datetime default null comment '数据最后修改时间',primary key (id)
) comment '管理员表' charset utf8mb4;
-- 管理员表:插入测试数据
insert into admin (username, password, nickname, email, description, is_enable) values('root', '1234', 'root', 'root@tedu.cn', '最高管理员', 1),('super_admin', '1234', 'administrator', 'admin@tedu.cn', '超级管理员', 1),('nobody', '1234', '无名', 'liucs@tedu.cn', null, 0);
role:角色表**
-- 角色表:创建数据表
drop table if exists role;
create table role (id bigint unsigned auto_increment,name varchar(50) default null comment '名称',description varchar(255) default null comment '描述',sort tinyint unsigned default 0 comment '自定义排序序号',gmt_create datetime default null comment '数据创建时间',gmt_modified datetime default null comment '数据最后修改时间',primary key (id)
) comment '角色表' charset utf8mb4;
-- 角色表:插入测试数据
insert into role (name) values('超级管理员'), ('系统管理员'), ('商品管理员'), ('订单管理员');
admin_role:管理员与角色的关联表
-- 管理员角色关联表:创建数据表
drop table if exists admin_role;
create table admin_role (id bigint unsigned auto_increment,admin_id bigint unsigned default null comment '管理员id',role_id bigint unsigned default null comment '角色id',gmt_create datetime default null comment '数据创建时间',gmt_modified datetime default null comment '数据最后修改时间',primary key (id)
) comment '管理员角色关联表' charset utf8mb4;
-- 管理员角色关联表:插入测试数据
insert into admin_role (admin_id, role_id) values(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (2, 4), (3, 3);
permission:权限表
l
-- 权限表:创建数据表
drop table if existspermission;
create table permission (id bigint unsigned auto_increment,name varchar(50) default null comment '名称',value varchar(255) default null comment '值',description varchar(255) default null comment '描述',sort tinyint unsigned default 0 comment '自定义排序序号',gmt_create datetime default null comment '数据创建时间',gmt_modified datetime default null comment '数据最后修改时间',primary key (id)
) comment '权限' charset utf8mb4;
-- 权限表:插入测试数据
insert into permission (name, value, description) values
('商品-商品管理-读取', '/pms/product/read', '读取商品数据,含列表、详情、查询等'),
('商品-商品管理-编辑', '/pms/product/update', '修改商品数据'),
('商品-商品管理-删除', '/pms/product/delete', '删除商品数据'),
('后台管理-管理员-读取', '/ams/admin/read', '读取管理员数据,含列表、详情、查询等'),
('后台管理-管理员-编辑', '/ams/admin/update', '编辑管理员数据'),
('后台管理-管理员-删除', '/ams/admin/delete', '删除管理员数据');
```
role_permission:角色与权限的关联表
-- 角色权限关联表:创建数据表
drop table if exists role_permission;
create table role_permission (id bigint unsigned auto_increment,role_id bigint unsigned default null comment '角色id',permission_id bigint unsigned default null comment '权限id',gmt_create datetime default null comment '数据创建时间',gmt_modified datetime default null comment '数据最后修改时间',primary key (id)
) comment '角色权限关联表' charset utf8mb4;
-- 角色权限关联表:插入测试数据
insert into role_permission (role_id, permission_id) values(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6),(2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6),(3, 1), (3, 2), (3, 3);
总结
RBAC(Role-Based Access Control)是一种访问控制模型,它基于用户的角色来管理对系统资源的访问权限。RBAC通过定义角色、权限和用户之间的关系,实现了对系统的细粒度控制,提供了一种灵活且安全的访问控制机制。
RBAC主要包括以下几个核心的概念:
-
角色(Role):角色是一组与特定功能或职责相关联的权限的集合。角色是RBAC中最重要的概念之一,它代表了用户在系统中所担任的角色或职位。
-
权限(Permission):权限是指对系统资源进行某种操作或访问的能力。权限可以是读取、写入、修改或删除等操作,也可以是对特定数据或功能的访问。
-
用户(User):用户代表系统中的实际用户或实体。用户可以被分配一个或多个角色,并由角色决定其在系统中所能执行的操作。
-
角色分配(Role Assignment):角色分配是指将角色分配给用户的过程。通过角色分配,系统可以确定每个用户在系统中所拥有的权限。
-
授权(Authorization):授权是指根据用户的角色和权限,对其请求进行验证和许可的过程。在RBAC中,授权决定了用户能否执行某个操作或访问某个资源。
-
角色继承(Role Inheritance):角色继承是指一个角色可以继承另一个角色的权限。通过角色继承,可以建立角色之间的层次结构,使得权限的管理更加灵活。
通过RBAC可以实现以下几个优点:
-
简化权限管理:RBAC通过角色的概念,将权限授权的管理与用户管理分离开来,简化了系统的权限管理。只需管理角色的权限,而不需要为每个用户单独设置权限。
-
提高安全性:RBAC提供了细粒度的权限控制,确保每个用户只能访问其所需的资源和执行其所需的操作。这样可以避免用户滥用权限或访问未授权的资源,提高了系统的安全性。
-
提升系统性能:通过RBAC可以减少权限判断的复杂性,提高系统的性能。只需根据用户的角色进行权限判断,而不需要逐个判断用户的权限。
-
支持易于维护的角色管理:RBAC可以方便地管理角色和权限的关系,通过角色的继承和分配,可以灵活地管理用户的权限。当用户角色发生变化时,只需调整其角色的分配即可,而不需要修改每个用户的权限。