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
相关产品推荐
相关产品推荐

