增强版 RBAC 权限管理数据库设计
概述
本设计方案基于 RBAC (Role-Based Access Control) 模式,旨在构建一个灵活、可扩展、易维护的权限管理系统。该方案不仅包含基本的角色、权限和资源管理,还增强了数据权限控制、字典管理和操作日志功能,以满足更复杂的业务需求。
数据库表结构
用户表 (sys_user)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
用户ID,主键 |
username |
VARCHAR(255) |
否 |
|
用户名,唯一索引 |
password |
VARCHAR(255) |
否 |
|
密码 |
real_name |
VARCHAR(255) |
是 |
|
真实姓名 |
email |
VARCHAR(255) |
是 |
|
邮箱 |
phone |
VARCHAR(20) |
是 |
|
电话 |
avatar |
VARCHAR(255) |
是 |
|
头像 URL |
status |
INT |
否 |
1 (启用) |
用户状态 (1: 启用, 0: 禁用) |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
角色表 (sys_role)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
角色ID,主键 |
role_name |
VARCHAR(255) |
否 |
|
角色名称,唯一索引 |
role_code |
VARCHAR(255) |
否 |
|
角色编码,唯一索引 |
description |
TEXT |
是 |
|
角色描述 |
data_scope |
VARCHAR(255) |
是 |
‘all’ |
数据范围 (all, self, dept, custom) |
status |
INT |
否 |
1 (启用) |
角色状态 (1: 启用, 0: 禁用) |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
部门表 (sys_dept)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
部门ID,主键 |
dept_name |
VARCHAR(255) |
否 |
|
部门名称 |
parent_id |
BIGINT |
是 |
0 |
父部门ID |
dept_code |
VARCHAR(255) |
是 |
|
部门编码,唯一索引 |
description |
TEXT |
是 |
|
部门描述 |
status |
INT |
否 |
1 (启用) |
部门状态 (1: 启用, 0: 禁用) |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
菜单ID,主键 |
menu_name |
VARCHAR(255) |
否 |
|
菜单名称 |
menu_code |
VARCHAR(255) |
否 |
|
菜单编码,唯一索引 |
parent_id |
BIGINT |
是 |
0 |
父菜单ID |
path |
VARCHAR(255) |
是 |
|
菜单路径 |
icon |
VARCHAR(255) |
是 |
|
菜单图标 |
component |
VARCHAR(255) |
是 |
|
前端组件路径 |
sort |
INT |
是 |
0 |
排序 |
type |
VARCHAR(255) |
是 |
‘menu’ |
菜单类型 (menu, button, link) |
status |
INT |
否 |
1 (启用) |
菜单状态 (1: 启用, 0: 禁用) |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
权限表 (sys_permission)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
权限ID,主键 |
permission_name |
VARCHAR(255) |
否 |
|
权限名称 |
permission_code |
VARCHAR(255) |
否 |
|
权限编码,唯一索引 |
description |
TEXT |
是 |
|
权限描述 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
资源表 (sys_resource)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
资源ID,主键 |
resource_name |
VARCHAR(255) |
否 |
|
资源名称 |
resource_path |
VARCHAR(255) |
否 |
|
资源路径 |
resource_type |
VARCHAR(255) |
否 |
|
资源类型 (例如:文件、API) |
description |
TEXT |
是 |
|
资源描述 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
字典表 (sys_dict)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
字典ID,主键 |
dict_name |
VARCHAR(255) |
否 |
|
字典名称 |
dict_code |
VARCHAR(255) |
否 |
|
字典编码,唯一索引 |
description |
TEXT |
是 |
|
字典描述 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
字典项表 (sys_dict_item)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
字典项ID,主键 |
dict_id |
BIGINT |
否 |
|
所属字典ID,外键关联 sys_dict 表 |
item_name |
VARCHAR(255) |
否 |
|
字典项名称,例如 “启用” |
item_value |
VARCHAR(255) |
否 |
|
字典项值,例如 “1” |
sort |
INT |
是 |
0 |
排序 |
description |
TEXT |
是 |
|
字典项描述 |
status |
INT |
否 |
1 (启用) |
字典项状态 (1: 启用, 0: 禁用) |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
update_time |
DATETIME |
否 |
当前时间 |
更新时间 |
用户角色关系表 (sys_user_role)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
user_id |
BIGINT |
否 |
|
用户ID,外键关联 sys_user 表 |
role_id |
BIGINT |
否 |
|
角色ID,外键关联 sys_role 表 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
用户部门关系表 (sys_user_dept)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
user_id |
BIGINT |
否 |
|
用户ID,外键关联 sys_user 表 |
dept_id |
BIGINT |
否 |
|
部门ID,外键关联 sys_dept 表 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
权限资源关系表 (sys_permission_resource)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
permission_id |
BIGINT |
否 |
|
权限ID,外键关联 sys_permission 表 |
resource_id |
BIGINT |
否 |
|
资源ID,外键关联 sys_resource 表 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
角色权限关系表 (sys_role_permission)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
role_id |
BIGINT |
否 |
|
角色ID,外键关联 sys_role 表 |
permission_id |
BIGINT |
否 |
|
权限ID,外键关联 sys_permission 表 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
role_id |
BIGINT |
否 |
|
角色ID,外键关联 sys_role 表 |
menu_id |
BIGINT |
否 |
|
菜单ID,外键关联 sys_menu 表 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
角色数据权限范围表 (sys_role_data_scope)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
主键 |
role_id |
BIGINT |
否 |
|
角色ID,外键关联 sys_role 表 |
dept_id |
BIGINT |
是 |
|
部门ID,外键关联 sys_dept 表,当角色数据范围为 dept 时使用 |
custom_scope |
TEXT |
是 |
|
自定义数据范围,存储 JSON 格式数据,当角色数据范围为 custom 时使用 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
操作日志表 (sys_operation_log)
| 字段名 |
数据类型 |
是否为空 |
默认值 |
说明 |
id |
BIGINT |
否 |
自增长 |
日志ID,主键 |
user_id |
BIGINT |
否 |
|
操作用户ID,外键关联 sys_user 表 |
operation_type |
VARCHAR(255) |
否 |
|
操作类型 (例如:create, update, delete) |
operation_module |
VARCHAR(255) |
否 |
|
操作模块 (例如:user, role, menu) |
operation_desc |
TEXT |
是 |
|
操作描述 |
request_url |
VARCHAR(255) |
是 |
|
请求 URL |
request_method |
VARCHAR(255) |
是 |
|
请求方法 |
request_params |
TEXT |
是 |
|
请求参数 |
response_data |
TEXT |
是 |
|
响应数据 |
ip_address |
VARCHAR(255) |
是 |
|
IP 地址 |
create_time |
DATETIME |
否 |
当前时间 |
创建时间 |
表关系图 (简述)
- 用户与角色:
sys_user 表和 sys_role 表之间通过 sys_user_role 表形成多对多关系。一个用户可以拥有多个角色,一个角色可以被多个用户拥有。
- 用户与部门:
sys_user 表和 sys_dept 表之间通过 sys_user_dept 表形成多对多关系。一个用户可以属于多个部门,一个部门可以有多个用户。
- 角色与权限:
sys_role 表和 sys_permission 表之间通过 sys_role_permission 表形成多对多关系。一个角色可以拥有多个权限,一个权限可以被多个角色拥有。
- 权限与资源:
sys_permission 表和 sys_resource 表之间通过 sys_permission_resource 表形成多对多关系。一个权限可以访问多个资源,一个资源可以被多个权限访问。
- 角色与菜单:
sys_role 表和 sys_menu 表之间通过 sys_role_menu 表形成多对多关系。一个角色可以访问多个菜单,一个菜单可以被多个角色访问。
- 字典与字典项:
sys_dict 表和 sys_dict_item 表之间是一对多关系。一个字典可以包含多个字典项。
- 角色与数据范围:
sys_role 表和 sys_role_data_scope 表之间是一对一或一对多的关系(取决于 data_scope 的值)。用于存储角色对应的数据权限范围,包括部门或自定义范围。
- 操作日志与用户:
sys_operation_log 表通过 user_id 字段外键关联到 sys_user 表,记录用户的操作行为。
关键概念说明
- 数据范围 (
data_scope): sys_role 表中的 data_scope 字段定义了角色所能访问的数据范围。
all: 可以访问所有数据。
self: 只能访问自己的数据。
dept: 只能访问自己所在部门的数据,具体部门在 sys_role_data_scope 表中关联。
custom: 可以访问自定义的数据范围,具体范围在 sys_role_data_scope 表中以 JSON 格式存储。
- 权限编码 (
permission_code): sys_permission 表中的 permission_code 字段用于程序中进行权限校验。
- 菜单编码 (
menu_code): sys_menu 表中的 menu_code 字段用于前端路由和权限控制。
- 字典编码 (
dict_code): sys_dict 表中的 dict_code 字段用于在代码中获取对应的字典项。
- 资源路径 (
resource_path): sys_resource 表中的 resource_path 字段用于 API 接口或静态资源的权限控制。
总结
本数据库设计方案旨在提供一个全面、灵活的权限管理系统,涵盖了用户、角色、部门、菜单、权限、资源、字典等多个方面。通过合理的表结构和关系设计,可以满足复杂业务场景下的权限管理需求,并方便后续的扩展和维护。同时,数据范围控制、字典管理和操作日志的加入,使得系统更加完善和健壮。