Spring Boot Security无限重定向循环的原因及解决方法
Spring Boot 3.2.5集成Spring Security无限重定向循环问题排查与解决
问题原因
- 授权规则不完整:
securityFilterChain配置中,authorizeHttpRequests仅指定了匹配/demo/{id}路径,但未明确该路径的授权规则(如是否需要认证、是否允许匿名访问),Spring Security会默认拦截所有请求要求认证。 - 自定义登录页配置缺失:配置了
.loginPage("/login"),但既没有开放/login路径的匿名访问权限,也没有实现/login对应的请求处理接口。当访问/demo/{id}被拦截重定向到/login后,/login同样被拦截要求认证,触发重复重定向,形成无限循环。
解决方法
方法一:完善授权规则并实现登录页接口
修改Security配置类中的securityFilterChain方法,补充授权规则并允许登录路径匿名访问:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests .requestMatchers("/demo/{id}").authenticated() // 指定/demo/{id}需要登录认证 .requestMatchers("/login").permitAll() // 允许匿名访问登录页 .anyRequest().permitAll() // 其他路径无需认证 ) .formLogin((form) -> form .loginPage("/login") // 自定义登录页路径 .permitAll() ) .logout((logout) -> logout.permitAll()); return http.build(); }
同时在控制器中添加/login的处理逻辑(根据项目类型选择返回页面或JSON):
@RestController public class DemoController { // 原有接口... @GetMapping("/login") public String login() { return "请访问登录页面进行认证"; // 或返回HTML页面模板名称 } }
方法二:使用Spring Security默认登录页
若无需自定义登录页,可移除.loginPage("/login")配置,使用框架提供的默认登录页面:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests .requestMatchers("/demo/{id}").authenticated() .anyRequest().permitAll() ) .formLogin(form -> form.permitAll()) // 启用默认登录页并允许匿名访问 .logout((logout) -> logout.permitAll()); return http.build(); }
内容的提问来源于stack exchange,提问作者Kifsif
相关产品推荐
相关产品推荐

