Spring Security:检查用户是否具有Hierarchical Role的方法

时间:2017-05-30 13:42:45

标签: java spring-security role hierarchical

我如何检查用户是否在运行时具有分层角色? 我知道这个网址授权解决方案@PreAuthorize("hasRole('ROLE_ADMIN')") 但如果我必须检查角色,在一个方法内?

例如:

ROLE_ADMIN> ROLE_USER> ROLE_GUEST

if (user.hasRole('ROLE_USER')){
    do something;
}

在此示例中,如果用户具有ROLE_ADMIN,则条件必须为true,因为在分层角色中ROLE_ADMIN> ROLE_USER。

由于

1 个答案:

答案 0 :(得分:0)

感谢大家的回复。 也许我找到了解决方案。 我用这个@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;
    }

似乎有效。