Spring Boot 3.5.5升级后登录页Controller未被调用问题排查
问题分析与解决方案
1. 重复SessionManagement配置引发冲突
在filterChain方法中,你重复调用了两次.sessionManagement()配置:
.sessionManagement((sessionsManagement) -> sessionsManagement.sessionFixation().migrateSession().maximumSessions(1)) // ... 其他配置后再次调用 .sessionManagement((sessionManagement) -> sessionManagement .sessionFixation((sfc) -> sfc.migrateSession()) .maximumSessions(1) .sessionRegistry(sessionRegistry()))
Spring Security的HttpSecurity链式配置中,重复设置会覆盖之前的逻辑,可能导致会话管理异常,间接干扰登录页跳转流程。
修复方案:合并重复配置,仅保留一次:
.sessionManagement((sessionManagement) -> sessionManagement .sessionFixation((sfc) -> sfc.migrateSession()) .maximumSessions(1) .sessionRegistry(sessionRegistry()))
2. AuthenticationTokenParsingFilter误拦截登录请求
自定义的AuthenticationTokenParsingFilter继承自AbstractAuthenticationProcessingFilter,虽然构造函数指定了"/auth/login/verify"作为拦截路径,但未限制请求方法,可能意外拦截/auth/login的GET请求;同时过滤器的添加位置也可能导致它过早介入认证流程。
修复方案:
- 在构造函数中明确限制仅处理POST请求:
public AuthenticationTokenParsingFilter(AuthenticationManager authenticationManager) { super(new AntPathRequestMatcher("/auth/login/verify", "POST")); // 指定仅拦截POST请求 setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler(CustomStrategyConfiguration.AUTHENTICATION_SUCCESS_URL)); setAuthenticationManager(authenticationManager); SimpleUrlAuthenticationFailureHandler handler = new SimpleUrlAuthenticationFailureHandler(); handler.setDefaultFailureUrl(CustomStrategyConfiguration.AUTHENTICATION_FAILURE_URL); setAuthenticationFailureHandler(handler); // 补充设置失败处理器 }
3. FormLogin配置与自定义Controller的匹配冲突
配置formLogin().loginPage("/auth/login")时,Spring Security会默认尝试处理该路径请求,若你有自定义Controller处理登录页,需确保:
- Controller的请求映射正确匹配GET请求:
@Controller @RequestMapping("/auth") public class AuthController { @GetMapping("/login") public String showLoginPage() { return "login"; // 返回登录页视图 } }
- 在Security配置中明确允许
/auth/login的GET请求:
.requestMatchers(HttpMethod.GET, "/auth/login").permitAll()
4. MultiProviderAuthenticationManager返回null的合规性问题
MultiProviderAuthenticationManager的authenticate方法在无匹配Provider时返回null,不符合Spring Security规范——认证失败应抛出AuthenticationException而非返回null,可能导致认证流程异常。
修复方案:修改方法,无可用Provider时抛出异常:
@Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { for (AuthenticationMethod method : authenticationMethodRegistry.getAuthenticationMethods()) { if(method == null || method.getAuthenticationProvider() == null) { continue; } AuthenticationProvider provider = method.getAuthenticationProvider(); if (provider.supports(authentication.getClass())) { Authentication result = provider.authenticate(authentication); if (result != null) { return result; } } } throw new ProviderNotFoundException("未找到合适的认证提供者"); }
5. 多SecurityFilterChain冲突排查
若共享库或其他配置类中存在另一个SecurityFilterChain,可能导致/auth/login请求被其他过滤链处理,无法到达自定义Controller。
排查方案:
- 启用Spring Security调试日志,查看请求过滤链匹配情况:
在application.properties添加:
logging.level.org.springframework.security=DEBUG
- 明确当前FilterChain的匹配范围,取消
securityMatcher("/**")的注释:
http .securityMatcher("/**") // 明确当前过滤链处理所有请求 // ... 其他配置
内容的提问来源于stack exchange,提问作者NeoP5

