博主前言:本以为这个就是代替传统 jwt 的插件,没想到复杂程度如此之高。Spring Security 本身是个高度自定义化的组件,必须花时间重点学习一下。以下为个人配置学习的流程,从零到权限管理、redis嵌入等步骤。
本文基于尚硅谷的 Spring Security 教程学习,文章与原教程有不小出入,仅供参考。
B站视频链接:尚硅谷Java项目SpringSecurity+OAuth2权限管理实战教程
RBAC(用户 - 角色 - 权限 - 资源)是目前广泛应用的权限结构,该结构能够动态管理权限,一般为三个对象模型和两个链接模型:
如图,用户可以有多个角色身份,角色可以被分配多种权限。
接下来我们要实现这个结构。
[!WARNING]
特殊注意,此角色非彼角色:
虽然我们设计了【角色】这个模型,但是在代码层面上,【角色】与代码的耦合度非常高——管理端和用户端的授权注解都是硬编码。
实际上,【角色】表为权限的打包集合,用于为用户分配权限及划分类别。
所以,若为单端系统,代码层面无需配置角色;若为双端乃至多端系统,代码层面每一端配置一个角色。
一、数据表实现
一共五个表,三个主表两个链接表。
- 用户表
user
列名 | 数据类型 | 描述 |
---|---|---|
id | int | 用户ID |
username | varchar | 用户名 |
password | varchar | 密码 |
status | tinyint | 状态(启用/禁用) |
… | … | … |
- 角色表
role
列名 | 数据类型 | 描述 |
---|---|---|
id | int | 角色ID |
name | varchar | 角色名称 |
type | varchar | 所属角色组 |
- 用户-角色链接表
lk_user_role
列名 | 数据类型 | 描述 |
---|---|---|
id | int | 用户角色关联ID |
user_id | int | 用户ID |
role_id | int | 角色ID |
- 权限表
permission
列名 | 数据类型 | 描述 |
---|---|---|
id | int | 权限ID |
name | varchar | 权限名称 |
value | varchar | 权限值 |
- 角色-权限链接表
lk_role_permission
列名 | 数据类型 | 描述 |
---|---|---|
id | int | 用户角色关联ID |
role_id | int | 角色ID |
permission_id | int | 权限ID |
建表语句和测试数据:
[!NOTE]
构建对应的
Mybatis-Plus
结构这里不再赘述。密码均为 password
-- 用户表
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY, -- 用户ID,自增主键
username VARCHAR(255) NOT NULL, -- 用户名,非空
password VARCHAR(255) NOT NULL, -- 密码,非空
status TINYINT(1) DEFAULT 1, -- 状态(启用/禁用),默认为1(启用)
-- 其他列可以根据需求添加
UNIQUE (username) -- 用户名唯一
);
-- 角色表
CREATE TABLE role (
id INT AUTO_INCREMENT PRIMARY KEY, -- 角色ID,自增主键
name VARCHAR(255) NOT NULL, -- 角色名称,非空
type VARCHAR(16) NOT NULL -- 所属角色组
);
-- 用户-角色链接表
CREATE TABLE lk_user_role (
id INT AUTO_INCREMENT PRIMARY KEY, -- 用户角色关联ID,自增主键
user_id INT NOT NULL, -- 用户ID,外键
role_id INT NOT NULL, -- 角色ID,外键
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE, -- 外键约束,删除用户时级联删除
FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE -- 外键约束,删除角色时级联删除
);
-- 权限表
CREATE TABLE permission (
id INT AUTO_INCREMENT PRIMARY KEY, -- 权限ID,自增主键
name VARCHAR(255) NOT NULL, -- 权限名称,非空
value VARCHAR(32) NOT NULL -- 权限描述
);
-- 角色-权限链接表
CREATE TABLE lk_role_permission (
id INT AUTO_INCREMENT PRIMARY KEY, -- 用户角色关联ID,自增主键
role_id INT NOT NULL, -- 角色ID,外键
permission_id INT NOT NULL, -- 权限ID,外键
FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE, -- 外键约束,删除角色时级联删除
FOREIGN KEY (permission_id) REFERENCES permission(id) ON DELETE CASCADE -- 外键约束,删除权限时级联删除
);
-- 测试数据
INSERT INTO `lk_role_permission` VALUES (1, 1, 1);
INSERT INTO `lk_role_permission` VALUES (2, 1, 2);
INSERT INTO `lk_role_permission` VALUES (3, 2, 2);
INSERT INTO `lk_user_role` VALUES (4, 1, 1);
INSERT INTO `lk_user_role` VALUES (5, 2, 2);
INSERT INTO `permission` VALUES (1, '查询用户列表', 'user_list');
INSERT INTO `permission` VALUES (2, '查询自己', 'user_myself');
INSERT INTO `role` VALUES (1, '管理员', 'admin');
INSERT INTO `role` VALUES (2, '普通用户', 'user');
INSERT INTO `user` VALUES (1, 'admin', '$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', 1);
INSERT INTO `user` VALUES (2, 'user', '$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', 1);
更多内容请访问:个人博客传送门