Spring Security:检查用户是不是具有分层角色的方法

Posted

技术标签:

【中文标题】Spring Security:检查用户是不是具有分层角色的方法【英文标题】:Spring Security: method to check if a user has a Hierarchical RoleSpring Security:检查用户是否具有分层角色的方法 【发布时间】:2017-10-31 00:44:25 【问题描述】:

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

例如:

ROLE_ADMIN > ROLE_USER > ROLE_GUEST

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

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

谢谢

【问题讨论】:

我不会写这段代码:if (user.hasRole('ROLE_USER') || user.hasRole('ROLE_ADMIN')) do something ,但前提是 (user.hasRole ('ROLE_USER')),只有最低角色 如果您的用户同时拥有 ROLE_ADMIN 和 ROLE_USER,则不必这样做 为什么需要方法内部的检查?为什么不使用@PreAuthorize(您似乎认为这与基于 URL 的安全性无关)。 【参考方案1】:

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

而且似乎有效。

【讨论】:

以上是关于Spring Security:检查用户是不是具有分层角色的方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Security 中检查现有的 HttpSession

具有 Security EvaluationContextExtensionSupport 的 Spring Data JPA 不起作用

Spring Security 中是不是存在会话超时异常?

在 Spring Security 中基于某种所有权设置用户角色

如何在spring security中逻辑组合pathMatchers

如何检查 Spring Security 的用户身份验证并从 Flex 获取角色?