学成在线-授权实现
学成-授权实现
1.RBAC理论
RBAC0 — 核心模型(基础)
最基础的形态,定义了三个核心要素及其关系:
1 | 用户(User) → 分配角色 → 角色(Role) → 分配权限 → 权限(Permission) |
- 用户 ↔ 角色:多对多(一个用户可有多个角色,一个角色可被多个用户持有)
- 角色 ↔ 权限:多对多(一个角色有多个权限,一个权限可属于多个角色)
- 会话(Session):用户登录后激活一个会话,会话中可激活该用户拥有的角色子集
RBAC1 — 角色层级模型
在 RBAC0 基础上加入角色继承:
1 | 超级管理员 |
- 通用继承:允许多重继承,形成 DAG(有向无环图)
- 受限继承:只允许树形单继承,更易管理
RBAC2 — 约束模型
在 RBAC0 基础上加入约束(Constraints),主要有:
| 约束类型 | 说明 | 例子 |
|---|---|---|
| 互斥角色(SSD) | 同一用户不能同时持有两个互斥角色 | 同一人不能既是”出纳”又是”审计” |
| 基数约束 | 限制角色最多能分配给多少用户 | “CEO”角色只能有 1 人 |
| 先决条件 | 必须先有角色 A 才能获得角色 B | 必须先是”员工”才能成为”项目经理” |
| 动态互斥(DSD) | 同一会话中不能同时激活两个互斥角色 | 同一次登录中不能同时激活”采购员”和”审批员” |
RBAC3 — 统一模型
= RBAC1(继承) + RBAC2(约束),是最完整的形态。
权限的本质:操作 × 对象
权限(Permission)由两个维度构成:
1 | Permission = Operation × Object |

2.分配权限
接口注解
1
jwt令牌1
2
3
4
5
6
7
8
9
10
11String userJson = JSON.toJSONString(user);
//用户权限,如果不加报Cannot pass a null GrantedAuthority collection
String[] authorities= {"test"};
List<XcMenu> xcMenus = xcMenuMapper.selectPermissionByUserId(user.getId());
if(xcMenus!=null&&xcMenus.size()>0){
List<String> permissions = new ArrayList<>();
xcMenus.forEach((e)->{
permissions.add(e.getCode());
});
authorities = permissions.toArray(new String[0]);
}数据库配置权限模型
3.细粒度授权

这个本质上就是 service 方法在编写的时候自己手动去规定自己需要实现的功能
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 十七.!