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

访问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选项查看)。
  • 检查前端请求代码,示例逻辑:
    const token = document.cookie.split('; ').find(row => row.startsWith('jwt='))?.split('=')[1];
    if (token) {
      axios.get('/admin_office/api', {
        headers: { 'Authorization': `Bearer ${token}` }
      });
    }
    
    确认这段逻辑没有因Cookie不存在等情况抛出异常。

5. CSRF拦截影响(次要)

如果开启了CSRF保护,虽然GET请求默认不拦截,但部分版本的Spring Security可能对带Authorization头的GET请求有特殊处理:

  • 前后端分离场景建议关闭CSRF:在WebSecurityConfig中添加.csrf().disable()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:59:49