RBAC表结构设计

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 在权限系统中,最核心的三张表为:用户表、角色表和菜单表(权限表),它们间的关系通常采用经典的 RBAC(Role-Based Access Control,基于角色的访问控制)模型。简单来说就是一个用户拥有若干角色,每一个角色拥有若干权限。这样就构造成 “用户-角色-权限” 的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般都是多对多的关系,如下图所示:

在权限系统中,最核心的三张表为:用户表角色表菜单表(权限表),它们间的关系通常采用经典的 RBAC(Role-Based Access Control,基于角色的访问控制)模型。简单来说就是一个用户拥有若干角色,每一个角色拥有若干权限。这样就构造成 “用户-角色-权限” 的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般都是多对多的关系,如下图所示:


比如获取用户名为 BNTang 的用户权限过程为:

  1. 通过 BNTang 的 user_id 从 t_user_role 表获取对应的 role_id;
  2. 通过第1步获取的 role_id 从 t_role_menu 表获取对应的 menu_id;
  3. 通过第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
EMAIL 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');


相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
设计模式 算法 安全
【设计模式】RBAC 模型详解
随着软件系统的复杂性和规模的不断增长,权限管理成为了一个至关重要的问题。在大型多人协作的系统中,如何有效地管理不同用户的访问权限,确保系统的安全性和稳定性,是每一个开发者都需要面对的挑战。为了解决这一问题,业界提出了一种被广泛应用的权限管理模型——基于角色的访问控制(Role-Based Access Control,简称RBAC)。希望通过本篇博客的学习,您能够深入了解RBAC模型的核心思想和实现原理,掌握如何在实际项目中应用RBAC模型来提高系统的安全性和可维护性。
2823 1
|
数据安全/隐私保护
经典权限系统设计(五张表)
经典权限系统设计(五张表)
|
存储 数据安全/隐私保护 索引
设计一个完美的用户角色权限表
设计一个完美的用户角色权限表
1567 1
|
监控 Java Spring
Spring Boot 拦截器(Interceptor)详解
本文介绍Spring Boot拦截器的原理与使用,涵盖自定义拦截器创建、注册配置、执行顺序及典型应用场景,助力提升系统安全性与可维护性。(238字)
1242 1
|
10月前
|
SQL JSON 前端开发
较为完整的SpringBoot项目结构
本文介绍了SpringBoot项目的分层结构与目录组成。项目分为四层:**controller层**(前端交互)、**service层**(业务逻辑处理)、**dao层**(数据库操作)和**model层**(实体类定义)。分层设计旨在实现关注点分离,降低耦合度,提高系统灵活性、可维护性和扩展性。此外,还详细说明了项目目录结构,包括`controller`、`service`、`dao`、`entity`、`param`、`util`等子目录的功能划分,便于团队协作开发。此架构有助于前后端分离,明确各模块职责,符合高内聚低耦合的设计原则。
6279 1
|
存储 安全 API
权限设计种类【RBAC、ABAC】
权限设计种类【RBAC、ABAC】
2794 2
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
7124 14
Spring Boot 3 集成 Spring Security + JWT
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
7857 1
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
875 0
|
存储 监控 安全
深入理解RBAC权限系统
RBAC(Role-Based Access Control)是一种访问控制模型,其核心概念是基于角色的权限分配。该模型的设计目标是简化对系统资源的访问管理,提高系统的安全性和可维护性。
3162 2
深入理解RBAC权限系统