场景:收银员 A 只能查看商品,收银员 B 额外拥有“修改商品”权限
场景:收银员 A 只能查看商品,收银员 B 额外拥有“修改商品”权限
纯数据库视角,无代码,按“建表 → 初始数据 → 用户 → 授权”四步清晰展开
1️⃣ 建表(共 6 张)
| 表名 | 作用 | 关键字段 |
| ----------------- | ------------------------------------------------ | ------------------------------- |
| t_user | 用户基本信息 | id, username, password, enabled |
| t_role | 角色(如 CASHIER) | id, role_key, role_name |
| t_user_role | 用户与角色的多对多关系 | user_id, role_id |
| t_permission | 权限(如 product:view) | id, perm_key, perm_name |
| t_role_permission | 角色与权限的多对多关系 | role_id, perm_id |
| t_user_extra_perm | 用户额外权限(实现“同角色不同权限”的核心表) | user_id, perm_key |
2️⃣ 初始化固定数据
2.1 角色
| id | role_key | role_name |
| ---- | -------- | --------- |
| 1 | CASHIER | 收银员 |
2.2 权限
| id | perm_key | perm_name |
| ---- | ------------ | --------- |
| 1 | product:view | 查看商品 |
| 2 | product:edit | 修改商品 |
2.3 角色默认权限
| role_id | perm_id | 说明 |
| ------- | ------- | ---------------------------- |
| 1 | 1 | 所有收银员默认只能“查看商品” |
3️⃣ 创建用户并分配角色
3.1 用户表
| id | username | password | enabled |
| ---- | --------- | --------------------- | ------- |
| 1 | cashier_a | (BCrypt 加密后的密码) | 1 |
| 2 | cashier_b | (BCrypt 加密后的密码) | 1 |
3.2 用户-角色关系
| user_id | role_id | 说明 |
| ------- | ------- | ------------------------- |
| 1 | 1 | 用户 A 属于“收银员”角色 |
| 2 | 1 | 用户 B 也属于“收银员”角色 |
4️⃣ 给 B 单独开通“修改商品”权限
4.1 操作
向 t_user_extra_perm 插入一条记录:
| user_id | perm_key | 说明 |
| ------- | ------------ | --------------------------------- |
| 2 | product:edit | 仅给用户 B 额外授予“修改商品”权限 |
4.2 结果速查
| 用户 | 所属角色 | 角色自带权限 | 额外权限 | 最终拥有权限 |
| --------- | -------- | ------------ | ------------ | -------------------- |
| cashier_a | CASHIER | product:view | — | 只能查看商品 |
| cashier_b | CASHIER | product:view | product:edit | 既能查看又能修改商品 |
结论:
角色表保持不变,通过 t_user_extra_perm 即可实现“同角色不同权限”的细粒度授权。
本文由萧兮的博客原创发布,欢迎转载,转载务必保留原文链接。
萧兮的博客:https://www.20010515.xyz · 原文:https://www.20010515.xyz/posts/92b7b7f2-49ea-4778-97f7-ecc19ac57368