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

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()

额外验证点

  1. 确认AppController的/login端点能正常返回login.jsp,可直接访问http://localhost:端口/login测试(绕过Security);
  2. 静态资源路径(/images/**、/css/**等)的匹配规则无需修改,当前写法已符合MvcRequestMatcher规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:34