Spring Boot认证异常:始终重定向登录,无法禁用CSRF,公开URL需认证
Spring Boot安全配置问题排查与修复
问题根源分析
- 路径匹配不精确:配置中
/home/(末尾带斜杠)仅匹配以/home/开头的路径,实际访问的/home(无斜杠)会被anyRequest().authenticated()规则拦截,触发登录重定向。 - 静态资源未放行:若页面依赖CSS/JS/图片等静态资源,这些资源会被默认拦截,导致页面加载时触发认证重定向(表现为页面持续跳登录)。
- CSRF禁用配置语法本身正确,但需结合实际请求验证是否生效。
修改后的配置代码
@Configuration @EnableWebSecurity public class SecurityConfiguration { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> auth // 修正路径匹配规则,覆盖/home及所有子路径,添加静态资源放行 .requestMatchers("/home/**", "/register/**", "/css/**", "/js/**", "/images/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() ) .formLogin(form -> form .permitAll() ) .build(); } @Bean public UserDetailsService userDetailsService() { UserDetails normalUser = User.builder() .username("gc") .password("$2a$12$pLlEDlW7J3LJMLMl0Uv8Xu.NO1TYDvrMmIpoDhpHZ3So65XlsR.Vy") .roles("USER") .build(); UserDetails adminUser = User.builder() .username("admin") .password("$2a$12$4MVGfzHJ2C370at3MTGHdeX6z/kon2X5KbVWZTGfqjWBhj.KnQBuC") .roles("ADMIN", "USER") .build(); return new InMemoryUserDetailsManager(normalUser, adminUser); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
关键修改说明
- 路径匹配修正:将
/home/改为/home/**,可匹配/home、/home/及/home下的所有子路径,确保公开路径真正绕过认证。 - 静态资源放行:添加
/css/**、/js/**、/images/**等常见静态资源路径,避免页面依赖资源被拦截导致异常重定向。 - CSRF验证:当前
csrf.disable()写法符合Spring Security 6.x语法,可通过Postman发送POST请求到公开接口(如/register)验证,若正常响应则说明CSRF已禁用。
测试步骤
- 访问
http://localhost:8080/home或http://localhost:8080/register,确认无需登录即可直接访问。 - 访问
/admin或/user路径,确认会自动跳转到登录页,登录后根据角色权限正常访问对应页面。 - 用Postman发送POST请求到
/register,验证请求可正常处理(无CSRF拦截报错)。
内容的提问来源于stack exchange,提问作者priyanshu o
相关产品推荐
相关产品推荐

