Spring Security配置引发无限重定向错误,如何解决?
解决Spring Boot Security无限重定向到/login的问题
问题原因
当前配置存在两个核心问题:
authorizeHttpRequests中设置anyRequest().authenticated(),要求所有请求必须认证,但自定义登录页路径/login也被纳入拦截范围,导致访问/login时被强制重定向到登录页,形成无限循环。CustomUserDetailsService手动实例化BCryptPasswordEncoder,而容器中已通过CustomSecurityConfig的passwordEncoder()Bean提供了加密器,冗余实例化可能导致加密逻辑不一致。
修改方案
1. 调整SecurityFilterChain配置,放行登录页
修改filterChain方法,明确允许/login路径匿名访问:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { log.info("-----------------configuration---------------------"); http .authorizeHttpRequests(authorize -> { authorize .requestMatchers("/login").permitAll() // 放行登录页请求 .anyRequest().authenticated(); }) .formLogin(formLogin -> { formLogin .loginPage("/login") .permitAll(); }); return http.build(); }
2. 统一使用容器中的PasswordEncoder
修改CustomUserDetailsService,通过构造器注入容器中的加密器,删除手动实例化逻辑:
@Log4j2 @Service @RequiredArgsConstructor public class CustomUserDetailsService implements UserDetailsService { private final PasswordEncoder passwordEncoder; // 注入容器内的加密器Bean @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("loadUserByUsername: " + username); UserDetails userDetails = User.builder() .username("user1") .password(passwordEncoder.encode("1111")) .authorities("ROLE_USER") .build(); return userDetails; } }
3. 确保存在/login路径的控制器
需要编写控制器处理/login请求,返回登录页面(以Thymeleaf为例):
@Controller public class LoginController { @GetMapping("/login") public String loginPage() { return "login"; // 对应resources/templates/login.html模板文件 } }
效果说明
修改后,访问/login时会被允许匿名访问,不再触发拦截重定向,可正常显示登录页面;同时统一使用容器内的加密器,保证密码加密逻辑一致。
内容的提问来源于stack exchange,提问作者Haebin Noh
相关产品推荐
相关产品推荐

