You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Basic Authentication的REST API安全配置(403错误排查)

问题排查与解决方案

1. 角色权限不匹配(核心原因)

Spring Security的hasAnyRole()方法会自动为传入的角色名称添加ROLE_前缀。你的配置中指定/test端点需要RoleService.ROLE_ACCOUNT_ADMIN角色,但实际在loadUserByUsername方法中,给用户添加的权限是ADMIN,两者完全不匹配,直接导致权限校验失败返回403。

两种修复方式二选一:

  • 方式一:适配hasAnyRole的前缀规则,修改权限赋值逻辑:
    // 假设RoleService.ROLE_ACCOUNT_ADMIN的值是ACCOUNT_ADMIN
    _authorities.add(new SimpleGrantedAuthority("ROLE_" + RoleService.ROLE_ACCOUNT_ADMIN.toString()));
    
  • 方式二:改用不自动加前缀的hasAnyAuthority方法,同时保持权限字符串一致:
    配置类修改:
    .antMatchers("/test").hasAnyAuthority(RoleService.ROLE_ACCOUNT_ADMIN.toString())
    
    UserDetails实现修改:
    _authorities.add(new SimpleGrantedAuthority(RoleService.ROLE_ACCOUNT_ADMIN.toString()));
    

2. 多配置类的优先级冲突

你存在多个WebSecurityConfigurerAdapter实现类,@Order(8)决定了配置的执行顺序。如果其他配置类的@Order值更小(优先级更高),且它们的规则覆盖了/test端点(比如拦截所有请求),当前配置就不会生效。

处理方案:

  • 调整当前配置类的@Order值为更小的数字(比如@Order(1)),确保它优先于其他配置生效。
  • 检查其他配置类,确保它们没有拦截/test端点,或者在其他配置中明确排除该端点:
    .antMatchers("/test").permitAll()
    

3. 密码加密一致性问题

你的配置使用了BCryptPasswordEncoder,但如果数据库中存储的密码不是通过该加密器生成的密文(比如明文或其他加密算法结果),会导致身份验证失败,最终返回403。

验证与修复:

  • 确认数据库中的密码是通过new BCryptPasswordEncoder(10).encode("原始密码")生成的密文。
  • 若之前为明文存储,需重新生成加密密码并更新到数据库。

4. 额外验证点

  • 给loadUserByUsername方法添加日志,确认能正常查询到目标用户,且用户名、密码、权限赋值正确。
  • 检查请求的Authorization头格式是否正确:Basic [base64编码的用户名:密码],确保base64编码无错误。

内容的提问来源于stack exchange,提问作者Manu Bouzas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:57:38