如何在运行时检查用户是否具有分层角色?我知道url授权@PreAuthorize("hasRole('ROLE_ADMIN')")
的这个解决方案,但是如果我必须检查角色呢?
例如:
ROLE_ADMIN > ROLE_USER > ROLE_GUEST
if (user.hasRole('ROLE_USER')){
do something;
}
在本例中,如果用户拥有ROLE_ADMIN,则条件必须为真,因为在分层角色中,ROLE_ADMIN > ROLE_USER。
谢谢
发布于 2017-05-30 23:43:27
感谢所有人的回复。也许我找到了解决方案。我用@Configuration创建了一个自定义的分层角色系统:
@Bean
public RoleHierarchy roleHierarchy(){
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_SUPERADMIN > ROLE_ADMIN ROLE_ADMIN > ROLE_USER ROLE_USER > ROLE_GUEST");
return roleHierarchy;
}
@Bean
public RoleHierarchyVoter roleVoter() {
return new RoleHierarchyVoter(roleHierarchy());
}
@Bean
public DefaultWebSecurityExpressionHandler expressionHandler(){
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}
在那之后,我创建了一个帮助函数:
public static boolean hasHierarchyRole(String role, RoleHierarchy roleHierarchy) {
Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
Collection<? extends GrantedAuthority> hierarchyAuthorities = roleHierarchy.getReachableGrantedAuthorities(authorities);
for (GrantedAuthority authority : hierarchyAuthorities) {
if (authority.getAuthority().equals(role)) {
return true;
}
}
return false;
}
而且看起来很管用。
https://stackoverflow.com/questions/44263972
复制相似问题