在spring security3.x的版本中
hasAnyRole這個方法不會對我們需要認證的身份前面加個前綴ROLE_,在3.x版本hasRole的源碼如下
public final boolean hasAnyRole(String... roles) { Set<String> roleSet = getAuthoritySet(); for (String role : roles) { if (roleSet.contains(role)) { return true; } } return false; }
而4.x版本下的會根據我的具體情況看看是不是要加前綴,代碼如下
public final boolean hasAnyRole(String... roles) { return hasAnyAuthorityName(defaultRolePrefix, roles); } private boolean hasAnyAuthorityName(String prefix, String... roles) { Set<String> roleSet = getAuthoritySet(); for (String role : roles) { String defaultedRole = getRoleWithDefaultPrefix(prefix, role); if (roleSet.contains(defaultedRole)) { return true; } } return false; }
private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) { if (role == null) { return role; } if (defaultRolePrefix == null || defaultRolePrefix.length() == 0) { return role; } if (role.startsWith(defaultRolePrefix)) { return role; } return defaultRolePrefix + role; }
這里的這個坑要小心,如果加了Role_前綴,那么你登錄時的角色的前面也需要加Role_才行,不然會認證失敗,然后就是403頁面了。(ps:hasRole這個方法也有這個版本問題,具體也是和hasAnyRole差不多。)