@Secured注解验证无法通过的问题

前言: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
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值