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

Spring Boot Security访问/admin端点返回403 Forbidden错误如何解决

Spring Boot Security 访问/admin接口返回403问题修复方案

根因定位

从给出的代码排查,共有4处错误导致权限校验不通过:

  1. 类名引用错误
  2. 实体属性缺少Setter方法
  3. 控制器路径配置不规范
  4. 角色存储值可能存在前缀/大小写匹配问题

修复步骤

  • 第一步:修正类名引用错误
    你定义的用户详情实现类名为CustomUserDetails,但CustomUserDetailsService中实例化的是CustomUserDetail(缺失末尾的s),修改CustomUserDetailsService代码如下:
@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      User user = userRepository.findByUsername(username);
      // 修正类名,把CustomUserDetail改成CustomUserDetails
      CustomUserDetails userDetail = null;

      if(user != null) {
        userDetail = new CustomUserDetails();
        userDetail.setUser(user);
      }
      else {
          throw new UsernameNotFoundException("user not exist with username " + username);
      }
        return  userDetail;
    }
}
  • 第二步:给CustomUserDetails添加user属性的Setter方法
    CustomUserDetails中的私有user属性缺少公共Setter方法,导致setUser(user)调用无效,权限集合加载为空,补充代码:
public class CustomUserDetails implements UserDetails {
    // 原有代码不变
    private User user;
    // 新增Setter方法
    public void setUser(User user) {
        this.user = user;
    }
    // 原有方法不变
}
  • 第三步:修正控制器路径配置
    UserController的@RequestMapping缺少前缀/,可能导致Security的/admin/**拦截规则匹配失败,修改为:
@RestController
@RequestMapping("/admin/users") // 补充前缀/
public class UserController {
    // 原有代码不变
}
  • 第四步:校验角色存储值规则
    CustomUserDetails中返回权限时已经自动拼接了ROLE_前缀,Security的hasRole("ADMIN")也会自动拼接ROLE_前缀,因此你的数据库中role字段存储的值必须为ADMIN(大小写完全匹配),不能带ROLE_前缀,否则会出现权限不匹配的问题。

修复完成后重启项目即可正常访问/admin下的接口。

内容的提问来源于stack exchange,提问作者Ahmed Hosny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:06:06