Spring Boot配置表单与自定义Token两种登录认证时Token跳转登录页问题
问题根源
你当前的配置存在两个核心问题:
- 优先级更高的JWT认证配置仅绑定了
LOGINJWT单个路径,除该路径外的所有业务请求都不会进入JWT认证链,会直接落到Order为2的表单登录配置链中,而表单登录链没有配置Token解析逻辑,未识别到认证信息就会触发登录页重定向。 - JWT认证链没有关闭默认的重定向逻辑和Session管理,就算认证失败也会沿用默认的表单登录跳转逻辑,而不会返回接口预期的401状态码。
解决方案
1. 调整JWT配置的路径匹配范围
把所有需要Token认证的接口路径统一纳管到JWT配置链中,比如业务接口统一使用/api/**前缀,就将JWT配置的匹配规则修改为匹配该前缀,确保相关请求不会落到表单登录配置链。
2. 补充JWT配置的无状态、无重定向设置
JWT认证为无状态模式,不需要Session、表单登录、重定向跳转相关逻辑,修正后的JWT配置示例如下:
protected void configure(HttpSecurity http) throws Exception { // @formatter:off http // 匹配所有需要Token认证的接口前缀 .mvcMatcher("/api/**") .csrf().disable() // 关闭Session创建,完全依赖Token认证 .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() // 认证失败直接返回401,不触发登录页重定向 .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)) .and() .addFilterBefore(authenticationFilter(), WebAsyncManagerIntegrationFilter.class) .authorizeRequests() // 配置/api前缀下的公开接口,比如获取Token的登录接口 .antMatchers("/api/auth/login").permitAll() .anyRequest().fullyAuthenticated() // 无状态认证不需要服务端logout逻辑,按需保留即可 .and() .logout().disable(); // @formatter:on }
3. 确认自定义过滤器的认证信息写入逻辑
确保你的customFilter在Token校验通过后,已经将生成的Authentication对象写入安全上下文:
// 认证成功后必须执行该步骤,否则后续权限校验会判定为未登录 SecurityContextHolder.getContext().setAuthentication(validatedAuthentication);
内容的提问来源于stack exchange,提问作者Mickey
相关产品推荐
相关产品推荐

