Spring Boot Security访问/admin端点返回403 Forbidden错误如何解决
Spring Boot Security 访问/admin接口返回403问题修复方案
根因定位
从给出的代码排查,共有4处错误导致权限校验不通过:
- 类名引用错误
- 实体属性缺少Setter方法
- 控制器路径配置不规范
- 角色存储值可能存在前缀/大小写匹配问题
修复步骤
- 第一步:修正类名引用错误
你定义的用户详情实现类名为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
相关产品推荐
相关产品推荐

