Bootstrap

Spring Security(六)RBAC 结构实现

博主前言:本以为这个就是代替传统 jwt 的插件,没想到复杂程度如此之高。Spring Security 本身是个高度自定义化的组件,必须花时间重点学习一下。以下为个人配置学习的流程,从零到权限管理、redis嵌入等步骤。
本文基于尚硅谷的 Spring Security 教程学习,文章与原教程有不小出入,仅供参考。
B站视频链接:尚硅谷Java项目SpringSecurity+OAuth2权限管理实战教程

RBAC(用户 - 角色 - 权限 - 资源)是目前广泛应用的权限结构,该结构能够动态管理权限,一般为三个对象模型和两个链接模型:

RBAC 结构图

如图,用户可以有多个角色身份,角色可以被分配多种权限。

接下来我们要实现这个结构。

[!WARNING]

特殊注意,此角色非彼角色:

虽然我们设计了【角色】这个模型,但是在代码层面上,【角色】与代码的耦合度非常高——管理端和用户端的授权注解都是硬编码。

实际上,【角色】表为权限的打包集合,用于为用户分配权限及划分类别。

所以,若为单端系统,代码层面无需配置角色;若为双端乃至多端系统,代码层面每一端配置一个角色。


一、数据表实现

一共五个表,三个主表两个链接表。

  1. 用户表user
列名数据类型描述
idint用户ID
usernamevarchar用户名
passwordvarchar密码
statustinyint状态(启用/禁用)
  1. 角色表role
列名数据类型描述
idint角色ID
namevarchar角色名称
typevarchar所属角色组
  1. 用户-角色链接表lk_user_role
列名数据类型描述
idint用户角色关联ID
user_idint用户ID
role_idint角色ID
  1. 权限表permission
列名数据类型描述
idint权限ID
namevarchar权限名称
valuevarchar权限值
  1. 角色-权限链接表lk_role_permission
列名数据类型描述
idint用户角色关联ID
role_idint角色ID
permission_idint权限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);


更多内容请访问:个人博客传送门

;