Spring Boot 2.7迁移至3.0后SecurityConfig引发ERR_TOO_MANY_REDIRECTS问题
问题诊断与解决方案
核心原因
你遇到的ERR_TOO_MANY_REDIRECTS是因为**MvcRequestMatcher与旧版AntPathMatcher的路径匹配规则存在差异**:
- 在Spring Boot 2.7使用的
AntPathMatcher中,/login**会匹配所有以/login开头的路径,包括/login本身、/login?error等; - 而Spring Boot 3.0使用的
MvcRequestMatcher遵循Spring MVC的路径匹配规则:**仅匹配多级子路径(如/login/abc),不会匹配/login本身。
这导致你的/login请求未被permitAll规则命中,被anyRequest().authenticated()拦截后重定向到登录页,形成循环重定向。
修复方案
修改/login相关的请求匹配规则,确保覆盖/login本身及带查询参数的场景(如登录失败后的/login?error):
方案1:精确匹配/login路径
@Bean public SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception { MvcRequestMatcher.Builder mvcMatcherBuilder = new MvcRequestMatcher.Builder(introspector); http .authorizeHttpRequests(authorizeRequests -> { authorizeRequests .requestMatchers(mvcMatcherBuilder.pattern("/admin/**")).hasAuthority("ADMIN") .requestMatchers(mvcMatcherBuilder.pattern("/images/**")).permitAll() .requestMatchers(mvcMatcherBuilder.pattern("/js/**")).permitAll() .requestMatchers(mvcMatcherBuilder.pattern("/css/**")).permitAll() .requestMatchers(mvcMatcherBuilder.pattern("/login")).permitAll() // 匹配/login及/login?error(忽略查询参数) .requestMatchers(mvcMatcherBuilder.pattern("/logout")).permitAll() .anyRequest().authenticated(); }) .formLogin(formLogin -> { formLogin .loginPage("/login") .permitAll(); }) .logout(logout -> { logout .logoutUrl("/logout") .permitAll(); }); return http.build(); }
方案2:匹配所有以/login开头的一级路径
如果需要兼容/login、/loginReset等路径,可改用/login*:
.requestMatchers(mvcMatcherBuilder.pattern("/login*")).permitAll()
备选方案:临时兼容Ant风格匹配
若需快速验证,可暂时改用AntPathRequestMatcher(不推荐长期使用,建议逐步适配MvcRequestMatcher):
.requestMatchers(new AntPathRequestMatcher("/login**")).permitAll()
额外验证点
- 确认
AppController的/login端点能正常返回login.jsp,可直接访问http://localhost:端口/login测试(绕过Security); - 静态资源路径(
/images/**、/css/**等)的匹配规则无需修改,当前写法已符合MvcRequestMatcher规范。
内容的提问来源于stack exchange,提问作者Karthik Sankaran
相关产品推荐
相关产品推荐

