集成WebSecurityConfigurerAdapter后所有请求返回403 Forbidden问题求助
问题排查与解决
1. 规则匹配顺序错误导致权限覆盖
Spring Security 的authorizeRequests规则是从上到下依次匹配,匹配到第一条后就不再执行后续规则。你的配置中:
.antMatchers(HttpMethod.GET, "/**") .hasAuthority("ADMIN") .antMatchers(HttpMethod.GET, "/tools") .hasAuthority("USER")
GET /**会匹配所有 GET 请求(包括/tools),导致后面针对/tools的权限规则永远不会生效。所有 GET 请求都被要求具备ADMIN权限,若当前用户只有USER权限,就会返回403。
修复方法:将更具体的路径规则放在前面,调整顺序:
.antMatchers(HttpMethod.GET, "/tools") .hasAuthority("USER") .antMatchers(HttpMethod.GET, "/**") .hasAuthority("ADMIN")
2. 缺少认证入口配置
你的配置仅定义了权限规则,但未配置用户认证方式(比如登录接口、HTTP Basic 认证等),同时设置了sessionCreationPolicy(SessionCreationPolicy.STATELESS)(无状态会话),请求没有携带合法认证信息时,会直接返回403。
修复方法:添加认证方式,以下是两种常见方案:
方案1:启用HTTP Basic认证(快速测试)
在configure(HttpSecurity http)中追加配置:
.and() .httpBasic(); // 启用HTTP Basic认证,测试时可通过账号密码完成登录
方案2:JWT认证(前后端分离场景常用)
若使用JWT,需自定义过滤器解析请求中的Token,将用户信息注入SecurityContext:
- 创建JWT过滤器类,继承
OncePerRequestFilter,实现Token解析、用户信息查询逻辑 - 在
configure(HttpSecurity http)中添加该过滤器:
.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
3. 冗余代码清理
你重复编写了两次CustomUserDetails类,保留其中一个即可,避免类冲突。
额外验证点
- 确认
UserDetailsService实现类已被正确加载,能根据用户名查询到用户数据 - 确认用户表中
role字段的值(如"ADMIN"或"USER")与配置中hasAuthority的参数大小写完全一致(Spring Security权限区分大小写) - 确认存储的密码是通过
BCryptPasswordEncoder加密后的字符串,而非明文
内容的提问来源于stack exchange,提问作者vitoriac
相关产品推荐
相关产品推荐

