Spring Security 6.0.0 requestMatchers配置致重定向循环及免登URL咨询
问题解答
1. requestMatchers() 与 antMatchers() 的关系
Spring Security 6.0 中antMatchers()被标记为过时,推荐用requestMatchers()替代。二者核心功能兼容,都支持Ant风格路径匹配(比如/info/**匹配/info下所有子路径),但requestMatchers()灵活性更强:
- 可同时兼容多种请求匹配器(如AntPathRequestMatcher、MvcRequestMatcher、正则匹配器等)
- 支持指定HTTP方法(例如
requestMatchers(HttpMethod.GET, "/login")) - 贴合框架现代配置风格,后续版本会持续扩展其能力
简言之,你之前用antMatchers()写的路径规则,直接替换成requestMatchers()就能无缝迁移。
2. 解决重定向循环(ERR_TOO_MANY_REDIRECTS)问题
你遇到的循环重定向,本质是访问/login时仍被要求认证,导致反复跳转。结合你的配置,问题大概率出在**/login路径没有实际页面/控制器支持**,或者匹配规则存在疏漏,具体修复步骤:
步骤1:确保/login路径可正常访问
Spring Security仅负责拦截请求并跳转,不会自动生成登录页面。你需要为/login提供对应的视图或控制器:
@Controller public class LoginController { @GetMapping("/login") public String loginPage() { // 返回登录页视图名,比如对应templates/login.html(Thymeleaf场景) return "login"; } }
同时确保模板引擎(如Thymeleaf)已正确配置,能找到对应的登录页面文件。
步骤2:优化安全配置细节
你的现有配置逻辑没问题,可做细节优化避免潜在匹配问题:
@Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(requests -> requests // 明确放行首页、登录页、info下所有路径的请求 .requestMatchers("/", "/login", "/info/**").permitAll() // 其余请求必须认证 .anyRequest().authenticated() ) .formLogin(form -> form // 指定自定义登录页路径 .loginPage("/login") // 放行所有登录相关请求(含POST提交表单) .permitAll() // 可选:配置登录成功后跳转路径 .defaultSuccessUrl("/dashboard", true) ) .logout(logout -> logout .permitAll() // 可选:配置登出成功后跳转路径 .logoutSuccessUrl("/") ); return http.build(); } }
步骤3:排查其他潜在问题
- 若登录页用到静态资源(如CSS、JS),需将这些路径也加入
permitAll,比如requestMatchers("/css/**", "/js/**").permitAll(),否则静态资源被拦截可能间接引发循环问题。 - 检查是否存在其他过滤器/拦截器干扰请求流程,导致
/login被错误拦截。
内容的提问来源于stack exchange,提问作者Felix Schildmann
相关产品推荐
相关产品推荐

