前言:springboot整合springsecurity采用@Secured注解无法通过,配置以及权限设置都没有问题,用户具有此权限还是返回org.springframework.security.access.AccessDeniedException: 不允许访问异常
原因:翻看源码发现
SecurityExpressionRoot类中有如下方法
private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) {
if (role == null) {
return role;
} else if (defaultRolePrefix != null && defaultRolePrefix.length() != 0) {
return role.startsWith(defaultRolePrefix) ? role : defaultRolePrefix + role;
} else {
return role;
}
}
而defaultRolePrefix属性声明:
private String defaultRolePrefix = "ROLE_";
解决:
第一种方式:把要授权的方法改为ROLE_开头,例如
@Secured("ROLE_SYSTEM_USER_VIEW")
@GetMapping()
public String user()
{
return prefix + "/user";
}
设置Authorities时带上"ROLE_"前缀即可
public Collection<? extends GrantedAuthority> getAuthorities() {
return permissions.parallelStream().filter(p -> !StringUtils.isEmpty(p))
.map(p -> new SimpleGrantedAuthority("ROLE_" + p)).collect(Collectors.toSet());
}
第二种方式:去掉默认的ROLE_前缀
从4.2版本后可以设置默认前缀
//授权时去掉默认角色前缀"ROLE_"
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
return new GrantedAuthorityDefaults(""); // Remove the ROLE_ prefix
}