权限五张表

11 阅读2分钟

在权限管理系统中,最经典、最通用的设计方案是 RBAC(Role-Based Access Control,基于角色的访问控制)

所谓“五张表”,就是实现这一模型的核心。它的逻辑非常简洁:不直接给用户分配权限,而是通过“角色”作为中转站。

1. 五张表的逻辑结构

这五张表由 3张基础表2张中间表(关系表) 组成:

基础表

  1. 用户表 (User) :存储用户的基本信息(如:用户名、密码、手机号)。
  2. 角色表 (Role) :定义系统中的身份(如:管理员、普通用户、运营人员、财务)。
  3. 权限表 (Permission/Menu) :定义系统中的具体资源(如:用户新增按钮、订单查看页面、导出Excel接口)。

中间表(建立多对多关系)

  1. 用户-角色关联表 (User-Role) :记录哪个用户拥有哪些角色。
  2. 角色-权限关联表 (Role-Permission) :记录哪个角色拥有哪些具体权限。

2. 详细字段设计示例

为了让你更有体感,这里给出一个简化的数据库设计参考:

① 用户表 (sys_user)

字段类型说明
idbigint主键
usernamevarchar登录账号
passwordvarchar加密密码

② 角色表 (sys_role)

字段类型说明
idbigint主键
role_namevarchar角色名称(如:超级管理员)
role_keyvarchar角色权限标识(如:admin)

③ 权限/菜单表 (sys_menu)

字段类型说明
idbigint主键
menu_namevarchar权限名称(如:删除订单)
permsvarchar权限标识(如:order:delete)
parent_idbigint父菜单ID(用于树形结构)

④ 用户-角色表 (sys_user_role)

字段类型说明
user_idbigint用户ID
role_idbigint角色ID

⑤ 角色-权限表 (sys_role_menu)

字段类型说明
role_idbigint角色ID
menu_idbigint权限/菜单ID

3. 为什么要这么设计?

如果直接把权限给用户(只有用户和权限两张表),当公司有1000个员工需要同样的权限时,你需要手动修改1000次。

使用“角色”中转的好处:

  • 解耦:用户和权限没有直接关系,灵活性极高。
  • 易维护:如果某个岗位的职责变了,只需要修改该角色的权限,所有关联该角色的用户会自动生效。
  • 符合直觉:在现实生活中,我们也是先定义“岗位(角色)”,再招人入职。

4. 在 Spring Boot 中的常见实现

由于你在学习 Java 和 Spring Boot,你可能会接触到 Spring SecurityShiro

在查询权限时,底层的 SQL 逻辑通常是这样的:

  1. 根据 username 查出 User
  2. 根据 user_iduser_role 表查出该用户拥有的所有 Role
  3. 根据 role_idrole_permission 表查出这些角色对应的所有 Permission
  4. 将权限集合存入 UserDetails 或 Session 中。