我的 Spring Boot 2 + Spring Security 应用程序中有一个角色层次结构:@Beanpublic RoleHierarchy roleHierarchy() { var rh = new RoleHierarchyImpl(); rh.setHierarchy("ROLE_ADMIN > ROLE_USER and ..."); return rh;}现在我(作为管理员)想代表另一个用户创建一个实体,但我应该检查该用户是否具有基于上述层次结构的特定权限。我知道可以为当前经过身份验证的用户调用 spring security hasRole() ,但就我而言,我想要授权的用户未经过身份验证。现在,我可以检查用户是否具有该特定权限:public boolean hasAuthority(User user, String authority) { return user.getAuthorities() .stream() .anyMatch(grantedAuthority -> grantedAuthority.getName().equals(authority));}但这样一来,相当长的层次结构将被忽略。如果有任何帮助,我将不胜感激。
1 回答
HUWWW
TA贡献1874条经验 获得超12个赞
您可以使用角色层次结构
Collection<? extends GrantedAuthority> getReachableGrantedAuthorities(Collection<? extends GrantedAuthority> authorities)返回所有可达权限的数组。
可达权限是直接分配的权限加上在角色层次结构中可以(传递地)从它们到达的所有权限。
示例:角色层次结构:ROLE_A > ROLE_B 和 ROLE_B > ROLE_C。
直接分配的权限:ROLE_A。
可达权限:ROLE_A、ROLE_B、ROLE_C。参数:
authorities
- 直接指定的权限列表。退货:
给定指定权限的所有可访问权限的列表。
您修改后的代码:
public boolean hasAuthority(User user, String authority) { return roleHierarchy() .getReachableGrantedAuthorities(user.getAuthorities()) .stream() .anyMatch(grantedAuthority -> grantedAuthority.getName().equals(authority)); }
添加回答
举报
0/150
提交
取消