Spring Security hasAnyRole()工作机制

时间:2017-08-28 16:51:24

标签: spring spring-security

我开发了一个使用spring security来设置授权的网页,我错误地设置了hasAnyRole("ADMIN, INTERNAL")而不是hasAnyRole("ADMIN", "INTERNAL"),但令人惊讶的是它按预期工作,即用户只有内部角色能够使用hasAnyRole("ADMIN, INTERNAL");

访问受限制的内容

我的问题基于底层实现,使用hasAnyRole("ADMIN, INTERNAL")代替hasAnyRole("ADMIN", "INTERNAL")不应该只给予只有ROLE_INTERNAL访问权限的用户,但事实上,它确实,这怎么可能?

我使用spring-security-config:4.1.1.RELEASE,hasAnyRole的调用堆栈是这样的

    public ExpressionInterceptUrlRegistry hasAnyRole(String... roles) {
        return access(ExpressionUrlAuthorizationConfigurer.hasAnyRole(roles));
    } 

然后在ExpressionUrlAuthorizationConfigurer.hasAnyRole(角色)

    private static String hasAnyRole(String... authorities) {
    String anyAuthorities = StringUtils.arrayToDelimitedString(authorities,
            "','ROLE_");
    return "hasAnyRole('ROLE_" + anyAuthorities + "')";
    }

然后在StringUtils.arrayToDelimitedString(Object [] arr,String delim)

    public static String arrayToDelimitedString(Object[] arr, String delim) {
    if (ObjectUtils.isEmpty(arr)) {
        return "";
    }
    if (arr.length == 1) {
        return ObjectUtils.nullSafeToString(arr[0]);
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < arr.length; i++) {
        if (i > 0) {
            sb.append(delim);
        }
        sb.append(arr[i]);
    }
    return sb.toString();
}

0 个答案:

没有答案