我开发了一个使用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();
}