RBAC表结构设计
在权限系统中,最核心的三张表为:用户表
、角色表
和菜单表
(权限表),它们间的关系通常采用经典的 RBAC(Role-Based Access Control,基于角色的访问控制)模型。简单来说就是一个用户拥有若干角色,每一个角色拥有若干权限。这样就构造成 “用户-角色-权限” 的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般都是多对多的关系,如下图所示:
比如获取用户名为 BNTang 的用户权限过程为:
- 通过 BNTang 的 user_id 从 t_user_role 表获取对应的 role_id;
- 通过第1步获取的 role_id 从 t_role_menu 表获取对应的 menu_id;
- 通过第2步获取的 menu_id 从 t_menu 获取 menu 相关信息(t_menu 表的 permission 为权限信息)。
下面开始设计这5张表(三张主表,两张关联表)。
在开始之前,我们需要安装MySQL(已经安装过的略过),这里采用5.7版本
https://dev.mysql.com/downloads/file/?id=487685,下载后直接安装即可。
安装好 MySQL 后,使用数据库连接工具创建一个名称为 bntang_cloud_base 的数据库,个人使用的是Navicat,所
以这里以Navicat为例。点击Navicat的连接按钮,类型选MySQL,连接刚刚安装好的MySQL数据库:
连接成功后,在新建的连接上右键选择新建数据库:
至此,数据库创建完毕,下面开始创建数据表。
t_user 表结构设计
t_user 表为用户表,用于存储用户信息。表结构如下所示:
字段名 | 类型 | 长度 | null | 主键 | 注释 |
---|---|---|---|---|---|
USER_ID | bigint | 20 | 否 | 是 | 用户ID |
USERNAME | varchar | 50 | 否 | 否 | 用户名 |
PASSWORD | varchar | 128 | 否 | 否 | 密码 |
DEPT_ID | bigint | 20 | 是 | 否 | 部门ID |
varchar | 128 | 是 | 否 | 邮箱 | |
MOBILE | varchar | 20 | 是 | 否 | 联系电话 |
STATUS | char | 1 | 否 | 否 | 状态 0 锁定 1 有效 |
CREATE_TIME | datetime | 0 | 否 | 否 | 创建时间 |
MODIFY_TIME | datetime | 0 | 是 | 否 | 修改时间 |
LAST_LOGIN_TIME | datetime | 0 | 是 | 否 | 最近访问时间 |
SSEX | char | 1 | 否 | 否 | 性别 0男 1女 2保密 |
AVATAR | varchar | 100 | 否 | 是 | 头像 |
DESCRIPTION | varchar | 100 | 是 | 否 | 描述 |
其中,因为 SEX 为 MySQL 关键字,所以使用 SSEX 代替了。
对应的建表语句为:
CREATE TABLE `t_user` (
`USER_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`USERNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
`PASSWORD` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
`DEPT_ID` bigint(20) NULL DEFAULT NULL COMMENT '部门ID',
`EMAIL` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`MOBILE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`STATUS` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '状态 0锁定 1有效',
`CREATE_TIME` datetime(0) NOT NULL COMMENT '创建时间',
`MODIFY_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`LAST_LOGIN_TIME` datetime(0) NULL DEFAULT NULL COMMENT '最近访问时间',
`SSEX` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别 0男 1女 2保密',
`AVATAR` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',
`DESCRIPTION` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`USER_ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
往表里插入一条数据:
INSERT INTO `t_user`
VALUES (1, 'BNTang', '$2a$10$gzhiUb1ldc1Rf3lka4k/WOoFKKGPepHSzJxzcPSN5/65SzkMdc.SK', 1, '303158131@qq.com',
'17788888888', '1', '2019-06-14 20:39:22', '2019-07-19 10:18:36', '2019-08-02 15:57:00', '0', 'default.jpg',
'我是帅比作者。');
密码为 1234qwer 经过 BCryptPasswordEncoder 加密后的值。
t_role 角色表设计
t_role 表为角色表,用于存储角色信息。表结构如下所示:
字段名 | 类型 | 长度 | null | 主键 | 注释 |
---|---|---|---|---|---|
ROLE_ID | bigint | 20 | 否 | 是 | 角色ID |
ROLE_NAME | varchar | 10 | 否 | 否 | 角色名称 |
REMARK | varchar | 100 | 是 | 否 | 角色描述 |
CREATE_TIME | datetime | 0 | 否 | 否 | 创建时间 |
MODIFY_TIME | datetime | 0 | 是 | 否 | 修改时间 |
对应的建表语句为:
CREATE TABLE `t_role` (
`ROLE_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`ROLE_NAME` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
`REMARK` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色描述',
`CREATE_TIME` datetime(0) NOT NULL COMMENT '创建时间',
`MODIFY_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`ROLE_ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色表' ROW_FORMAT = Dynamic;
往表里插入一条数据:
INSERT INTO `t_role`
VALUES (1, '管理员', '管理员', '2019-08-08 16:23:11', '2019-08-09 14:38:59');
t_menu 表结构设计
t_menu 为菜单表,用于存储菜单、按钮及其对应的权限标识,表结构如下:
字段名 | 类型 | 长度 | null | 主键 | 注释 |
---|---|---|---|---|---|
MENU_ID | bigint | 20 | 否 | 是 | 菜单/按钮ID |
PARENT_ID | bigint | 20 | 否 | 否 | 上级菜单ID |
MENU_NAME | varchar | 50 | 否 | 否 | 菜单/按钮名称 |
PATH | varchar | 255 | 否 | 否 | 对应路由path |
COMPONENT | varchar | 255 | 否 | 否 | 对应路由组件component |
PERMS | varchar | 50 | 是 | 否 | 权限标识 |
ICON | varchar | 50 | 是 | 否 | 图标 |
TYPE | char | 2 | 否 | 否 | 类型 0菜单 1按钮 |
ORDER_NUM | double | 20 | 是 | 否 | 排序 |
CREATE_TIME | datetime | 0 | 否 | 否 | 创建时间 |
MODIFY_TIME | datetime | 0 | 否 | 否 | 修改时间 |
对应的建表语句为:
CREATE TABLE `t_menu` (
`MENU_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单/按钮ID',
`PARENT_ID` bigint(20) NOT NULL COMMENT '上级菜单ID',
`MENU_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单/按钮名称',
`PATH` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '对应路由path',
`COMPONENT` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '对应路由组件component',
`PERMS` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限标识',
`ICON` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标',
`TYPE` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类型 0菜单 1按钮',
`ORDER_NUM` double(20, 0) NULL DEFAULT NULL COMMENT '排序',
`CREATE_TIME` datetime(0) NOT NULL COMMENT '创建时间',
`MODIFY_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`MENU_ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单表' ROW_FORMAT = Dynamic;
插入几条数据:
INSERT INTO `t_menu` VALUES (1, 0, '系统管理', '/system', 'Layout', NULL, 'el-icon-set-up', '0', 1, '2017-12-27 16:39:07', '2019-07-20 16:19:04');
INSERT INTO `t_menu` VALUES (2, 1, '用户管理', '/system/user', 'bntang/system/user/Index', 'user:view', '', '0', 1, '2017-12-27 16:47:13', '2019-01-22 06:45:55');
INSERT INTO `t_menu` VALUES (3, 2, '新增用户', '', '', 'user:add', NULL, '1', NULL, '2017-12-27 17:02:58', NULL);
INSERT INTO `t_menu` VALUES (4, 2, '修改用户', '', '', 'user:update', NULL, '1', NULL, '2017-12-27 17:04:07', NULL);
INSERT INTO `t_menu` VALUES (5, 2, '删除用户', '', '', 'user:delete', NULL, '1', NULL, '2017-12-27 17:04:58', NULL);
t_user_role 表结构设计
t_user_role 表用于关联用户和角色表,表结构如下所示:
字段名 | 类型 | 长度 | null | 主键 | 注释 |
---|---|---|---|---|---|
USER_ID | bigint | 20 | 否 | 否 | 用户ID |
ROLE_ID | bigint | 20 | 否 | 否 | 角色ID |
对应的建表语句为:
CREATE TABLE `t_user_role` (
`USER_ID` bigint(20) NOT NULL COMMENT '用户ID',
`ROLE_ID` bigint(20) NOT NULL COMMENT '角色ID'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色关联表' ROW_FORMAT = Dynamic;
插入一条数据:
INSERT INTO `t_user_role` VALUES (1, 1);
通过这条数据,user_id 为 1 的用户和 role_id 为 1 的角色进行了关联,即 BNTang 用户角色为管理员。
t_role_menu 表结构设计
t_role_menu 用于关联角色和菜单表,表结构如下所示:
字段名 | 类型 | 长度 | null | 主键 | 注释 |
---|---|---|---|---|---|
ROLE_ID | bigint | 20 | 否 | 否 | 角色ID |
MENU_ID | bigint | 20 | 否 | 否 | 菜单/按钮ID |
对应的建表语句为:
CREATE TABLE `t_role_menu` (
`ROLE_ID` bigint(20) NOT NULL,
`MENU_ID` bigint(20) NOT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单关联表' ROW_FORMAT = Dynamic;
插入一些数据:
INSERT INTO `t_role_menu` VALUES (1, 1);
INSERT INTO `t_role_menu` VALUES (1, 2);
INSERT INTO `t_role_menu` VALUES (1, 3);
INSERT INTO `t_role_menu` VALUES (1, 4);
INSERT INTO `t_role_menu` VALUES (1, 5);
通过这些数据,管理员角色已经拥有系统管理、用户管理、新增用户、修改用户和删除用户权限。
t_dept 表结构设计
在 t_user 表中,有个 dept_id 字段,表示用户对应的部门。t_dept 表用于存储部门信息,它本质上和 RBAC 没啥关系,一般用于控制数据权限。t_dept 表结构如下所示:
字段名 | 类型 | 长度 | null | 主键 | 注释 |
---|---|---|---|---|---|
DEPT_ID | bigint | 20 | 否 | 是 | 部门ID |
PARENT_ID | bigint | 20 | 否 | 否 | 上级部门ID |
DEPT_NAME | varchar | 100 | 否 | 否 | 部门名称 |
ORDER_NUM | double | 20 | 是 | 否 | 排序 |
CREATE_TIME | datetime | 0 | 否 | 否 | 创建时间 |
MODIFY_TIME | datetime | 0 | 是 | 否 | 修改时间 |
对应的建表语句为:
CREATE TABLE `t_dept` (
`DEPT_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门ID',
`PARENT_ID` bigint(20) NOT NULL COMMENT '上级部门ID',
`DEPT_NAME` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部门名称',
`ORDER_NUM` double(20, 0) NULL DEFAULT NULL COMMENT '排序',
`CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`MODIFY_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`DEPT_ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
插入一条部门数据:
INSERT INTO `t_dept` VALUES (1, 0, '开发部', 1, '2018-01-04 15:42:26', '2019-01-05 21:08:27');
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具