我的 Spring Boot 2 + Spring Security 應(yīng)用程序中有一個角色層次結(jié)構(gòu):@Beanpublic RoleHierarchy roleHierarchy() { var rh = new RoleHierarchyImpl(); rh.setHierarchy("ROLE_ADMIN > ROLE_USER and ..."); return rh;}現(xiàn)在我(作為管理員)想代表另一個用戶創(chuàng)建一個實體,但我應(yīng)該檢查該用戶是否具有基于上述層次結(jié)構(gòu)的特定權(quán)限。我知道可以為當(dāng)前經(jīng)過身份驗證的用戶調(diào)用 spring security hasRole() ,但就我而言,我想要授權(quán)的用戶未經(jīng)過身份驗證。現(xiàn)在,我可以檢查用戶是否具有該特定權(quán)限:public boolean hasAuthority(User user, String authority) { return user.getAuthorities() .stream() .anyMatch(grantedAuthority -> grantedAuthority.getName().equals(authority));}但這樣一來,相當(dāng)長的層次結(jié)構(gòu)將被忽略。如果有任何幫助,我將不勝感激。
1 回答
HUWWW
TA貢獻1874條經(jīng)驗 獲得超12個贊
您可以使用角色層次結(jié)構(gòu)
Collection<??extends?GrantedAuthority>?getReachableGrantedAuthorities(Collection<??extends?GrantedAuthority>?authorities)返回所有可達權(quán)限的數(shù)組。
可達權(quán)限是直接分配的權(quán)限加上在角色層次結(jié)構(gòu)中可以(傳遞地)從它們到達的所有權(quán)限。
示例:角色層次結(jié)構(gòu):ROLE_A > ROLE_B 和 ROLE_B > ROLE_C。
直接分配的權(quán)限:ROLE_A。
可達權(quán)限:ROLE_A、ROLE_B、ROLE_C。參數(shù):
authorities- 直接指定的權(quán)限列表。退貨:
給定指定權(quán)限的所有可訪問權(quán)限的列表。
您修改后的代碼:
public?boolean?hasAuthority(User?user,?String?authority)?{?
???return?roleHierarchy()
????????.getReachableGrantedAuthorities(user.getAuthorities())
????????.stream()
????????.anyMatch(grantedAuthority?->?grantedAuthority.getName().equals(authority));
}添加回答
舉報
0/150
提交
取消
