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

Spring Boot 3.0.0迁移时X-Auth-Token丢失引发认证异常求助

Spring Boot 2.2.6迁移至3.0.0后认证重定向AccessDenied问题排查

问题描述

从Spring Boot 2.2.6迁移到3.0.0后,未修改原有配置却出现认证异常:完成认证操作后,重定向时抛出AccessDenied异常,该异常被封装为InsufficientAuthenticationException。

现有SecurityFilterChain配置

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  http.csrf().disable();
  http.headers().cacheControl().disable();
  http.headers().frameOptions().sameOrigin();
  http.headers().contentTypeOptions().disable();

  AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry = http.authorizeHttpRequests();
  addPermissionToRegistry(registry, PUBLIC_URLS);
  addPermissionToRegistry(registry, USER_URLS, UserRole.USER.name());
  addPermissionToRegistry(registry, ADMIN_URLS, UserRole.ADMIN.name());
  registry.anyRequest().authenticated();
  http.formLogin().loginPage(BackendConstants.USER_PUBLIC_URL).permitAll();
  http.logout().logoutRequestMatcher(new AntPathRequestMatcher(BackendConstants.LOGOUT_ENDPOINT)).invalidateHttpSession(true)
  .logoutSuccessUrl(BackendConstants.USER_PUBLIC_URL).permitAll();

  http.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler())
  .authenticationEntryPoint(new CustomLoginUrlAuthenticationEntryPoint());
  return http.build();
}

问题更新(2022-12-23)

经排查,问题根源在于请求头中的X-Auth-Token丢失:前端通过Javascript设置该请求头后,服务器无法接收到;但使用Postman手动传入该请求头时,Servlet可正常处理请求。

解决思路

  • 检查跨域(CORS)配置:Spring Boot 3.0对CORS处理逻辑有调整,若前端为跨域请求,需确保CORS配置明确允许携带X-Auth-Token请求头。在CorsConfiguration中添加addAllowedHeader("X-Auth-Token"),同时设置allowCredentials(true),否则浏览器会自动过滤自定义请求头。
  • 验证前端请求头设置逻辑:确认JS代码是否在请求发送前的拦截器中正确设置X-Auth-Token,且没有被后续逻辑覆盖或清除。同时检查跨域预检请求(OPTIONS)是否被后端正确处理,若预检请求未通过,实际请求的头信息将无法携带。
  • 排查过滤器执行顺序:Spring Boot 3.0中SecurityFilterChain的过滤器顺序可能发生变化,若存在处理X-Auth-Token的自定义认证过滤器,需确认其在过滤器链中的执行位置,避免请求头被提前过滤。
  • 检查Cookie SameSite属性:若使用Cookie存储会话信息,Spring Boot 3.0默认的SameSite属性可能调整,导致跨域场景下Cookie无法正常携带,进而影响认证信息传递。可通过配置server.servlet.session.cookie.same-site=None(需配合secure=true,仅在HTTPS环境下生效)适配跨域场景。
  • 开启调试日志定位:开启Spring Security的DEBUG级别日志,跟踪请求头在过滤器链中的传递流程,确认X-Auth-Token是否在到达认证逻辑前已丢失,以此缩小问题范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:20:36