spring - 使用 Spring Security 的非线性角色层次结构
问题描述
我正在尝试使用 Spring Security (Boot Starter) 实现具有“非线性”角色层次结构的结构。
为了更好地解释它,想象以下情况:
角色:
- 总统
- 人力资源总监
- IT总监
- 助手
- 技术员
角色层次结构:
- 人力资源总监 > 助理
- IT 总监 > 技术员
现在的问题:
- 总裁 > 人力资源总监
和
- 总裁 > IT总监
当我使用注册角色层次结构时
roleHierarchy.setRoleHierarchy("PRESIDENT>HUMAN_RESOURCES_DIRECTOR");
roleHierarchy.setRoleHierarchy("PRESIDENT>IT_DIRECTOR");
它只记录“PRESIDENT> IT_DIRECTOR”。
这可能是因为我可能误解了 Spring Security Role Hierarchy。
无论如何,我如何应用它以便我的“总统”可以访问这两个角色权限而无需添加大量的手动授权?
编辑:
澄清一下,我发现的所有示例都遵循线性层次结构,例如
总裁 > IT总监
IT 总监 > 技术员
编辑2:
在 Spring Security Debug 中,当以公开的方式实现这种非线性角色层次结构时,我收到类似于以下内容的消息:
getReachableGrantedAuthorities() - From the roles [ROLE_PRESIDENT] one can reach [ROLE_PRESIDENT, ROLE_IT_DIRECTOR] in zero or more steps.
解决方案
问题在于对“setRoleHierarchy”方法的理解。
该方法设置角色层次结构,而不是添加它。
为了做想要的事情,需要“连接”层次结构,如下所示:
String hierarchy = "ROLE_PRESIDENT > ROLE_IT_DIRECTOR "+"ROLE_PRESIDENT > ROLE_HUMAN_RESOURCES_DIRECTOR"; // Or write it straight up
roleHierarchy.setRoleHierarchy(hierarchy);
推荐阅读
- node.js - Socket.io 仅向房间中的某些用户发送消息
- c# - 创建新文件时自动更改“复制到输出目录”
- webpack - 使用 Webpack Encore 引入 RequireJS AMD 模块
- knex.js - knex.raw() 和 knex.schema.raw() 有什么区别?
- python - Django 2.13:/basic_app/user_login/ 的 NoReverseMatch
- c# - 调用 MySQL 过程给出“找不到过程”的异常
- php - 选择非括号和非引号逗号
- python - 为什么 cv2.imread 会改变像素值?
- java - 爪哇 | 移出边界索引,直到它在边界内
- python - 无法将操作“compute_qmap_grid/map/while/PrintV2”转换为张量