【问题标题】: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 的安全性无关)。

标签: java spring-security role hierarchical


【解决方案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;
    }

而且似乎有效。

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 2014-12-26
    • 2017-09-21
    • 2016-12-03
    • 1970-01-01
    • 2010-12-22
    • 2019-06-16
    • 2019-12-19
    相关资源
    最近更新 更多