在权限管理系统中,最经典、最通用的设计方案是 RBAC(Role-Based Access Control,基于角色的访问控制) 。
所谓“五张表”,就是实现这一模型的核心。它的逻辑非常简洁:不直接给用户分配权限,而是通过“角色”作为中转站。
1. 五张表的逻辑结构
这五张表由 3张基础表 和 2张中间表(关系表) 组成:
基础表
- 用户表 (User) :存储用户的基本信息(如:用户名、密码、手机号)。
- 角色表 (Role) :定义系统中的身份(如:管理员、普通用户、运营人员、财务)。
- 权限表 (Permission/Menu) :定义系统中的具体资源(如:用户新增按钮、订单查看页面、导出Excel接口)。
中间表(建立多对多关系)
- 用户-角色关联表 (User-Role) :记录哪个用户拥有哪些角色。
- 角色-权限关联表 (Role-Permission) :记录哪个角色拥有哪些具体权限。
2. 详细字段设计示例
为了让你更有体感,这里给出一个简化的数据库设计参考:
① 用户表 (sys_user)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| username | varchar | 登录账号 |
| password | varchar | 加密密码 |
② 角色表 (sys_role)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| role_name | varchar | 角色名称(如:超级管理员) |
| role_key | varchar | 角色权限标识(如:admin) |
③ 权限/菜单表 (sys_menu)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| menu_name | varchar | 权限名称(如:删除订单) |
| perms | varchar | 权限标识(如:order:delete) |
| parent_id | bigint | 父菜单ID(用于树形结构) |
④ 用户-角色表 (sys_user_role)
| 字段 | 类型 | 说明 |
|---|---|---|
| user_id | bigint | 用户ID |
| role_id | bigint | 角色ID |
⑤ 角色-权限表 (sys_role_menu)
| 字段 | 类型 | 说明 |
|---|---|---|
| role_id | bigint | 角色ID |
| menu_id | bigint | 权限/菜单ID |
3. 为什么要这么设计?
如果直接把权限给用户(只有用户和权限两张表),当公司有1000个员工需要同样的权限时,你需要手动修改1000次。
使用“角色”中转的好处:
- 解耦:用户和权限没有直接关系,灵活性极高。
- 易维护:如果某个岗位的职责变了,只需要修改该角色的权限,所有关联该角色的用户会自动生效。
- 符合直觉:在现实生活中,我们也是先定义“岗位(角色)”,再招人入职。
4. 在 Spring Boot 中的常见实现
由于你在学习 Java 和 Spring Boot,你可能会接触到 Spring Security 或 Shiro。
在查询权限时,底层的 SQL 逻辑通常是这样的:
- 根据
username查出 User。 - 根据
user_id在user_role表查出该用户拥有的所有 Role。 - 根据
role_id在role_permission表查出这些角色对应的所有 Permission。 - 将权限集合存入
UserDetails或 Session 中。