为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Security hasRole() 用于未经身份验证的用户,考虑角色层次结构

Spring Security hasRole() 用于未经身份验证的用户,考虑角色层次结构

UYOU 2023-04-19 10:35:43
我的 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));
}


查看完整回答
反对 回复 2023-04-19
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信