访问Admin控制台时出现403权限错误的技术排查问询
问题原因排查与解决方案
核心矛盾点
当配置.antMatchers("/admin_office/**").hasRole("ADMIN")时,前端请求丢失Authorization头导致403,本质是权限校验逻辑触发后,Token的读取或传递环节出现异常,以下是具体排查方向:
1. Spring Security过滤器链顺序错误
如果JWT过滤器在权限校验过滤器(FilterSecurityInterceptor)之后执行,会导致还没解析Token获取用户权限就被拦截,直接返回403:
- 检查WebSecurityConfig中是否通过
addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)将JWT过滤器添加到正确位置,确保Token解析在权限校验前完成。 - 避免使用
addFilterAfter,否则权限校验时SecurityContext中还没有用户认证信息。
2. Cookie读取失败
前端无法从Cookie中获取JWT Token,自然无法携带Authorization头:
- 检查登录时设置Cookie的属性:如果Cookie标记为
HttpOnly,前端JS无法直接读取,这时候之前permitAll能访问可能是后端有临时放行逻辑,而权限校验时则暴露了问题。 - 确认Cookie的
SameSite属性:如果设置为Strict,重定向后的跨域/跨站点请求不会携带Cookie;跨域场景建议设为None并配合Secure属性。 - 检查Cookie的
Path:如果Path设置为/login,那么/admin_office路径下无法读取该Cookie。
3. JWT权限映射不匹配
Spring Security的hasRole("ADMIN")会自动拼接ROLE_前缀,要求Token中的权限必须是ROLE_ADMIN:
- 检查JWT Token中的权限字段(比如
authorities或roles),如果存储的是ADMIN,需要改为hasAuthority("ADMIN"),或者在生成Token时添加ROLE_前缀。 - 确认JWT过滤器中是否将解析出的权限正确封装到
Authentication对象的authorities集合中,示例代码:List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"); SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user, null, authorities));
4. 前端请求头设置逻辑失效
重定向到Admin页面后,前端代码可能没有正确读取Cookie并设置Authorization头:
- 查看浏览器控制台的Network面板,确认Admin页面加载时是否成功读取到Cookie(可在Application面板的Cookie选项查看)。
- 检查前端请求代码,示例逻辑:
确认这段逻辑没有因Cookie不存在等情况抛出异常。const token = document.cookie.split('; ').find(row => row.startsWith('jwt='))?.split('=')[1]; if (token) { axios.get('/admin_office/api', { headers: { 'Authorization': `Bearer ${token}` } }); }
5. CSRF拦截影响(次要)
如果开启了CSRF保护,虽然GET请求默认不拦截,但部分版本的Spring Security可能对带Authorization头的GET请求有特殊处理:
- 前后端分离场景建议关闭CSRF:在WebSecurityConfig中添加
.csrf().disable()。
内容的提问来源于stack exchange,提问作者PavelPavlik
相关产品推荐
相关产品推荐

