Spring Boot 3 SecurityFilterChain配置问题:/home无法匿名访问
问题分析与解决方案
核心问题是你的securityFilterChain方法没有添加@Bean注解,Spring无法识别并加载这个安全过滤链配置,导致Spring Security启用了默认规则——所有请求都需要认证,所以访问/home会被重定向到登录页。
另外,你的授权规则写法可以优化,避免多次调用authorizeHttpRequests(),保持配置的连贯性。
修正后的完整代码
package xxxxxxxxxxxxx import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public UserDetailsService userDetailsService(PasswordEncoder encoder) { UserDetails admin = User.withUsername("admin") .password(encoder.encode("pass")) .roles("ADMIN") .build(); UserDetails user1 = User.withUsername("user1") .password(encoder.encode("pass1")) .roles("USER") .build(); return new InMemoryUserDetailsManager(admin,user1); } // 添加@Bean注解,让Spring加载这个配置 @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http.csrf().disable() .authorizeHttpRequests(auth -> auth .requestMatchers("/home").permitAll() // 允许所有人访问/home .requestMatchers("/item/**").authenticated() // /item/**需要认证 .anyRequest().authenticated() // 其他所有请求都需要认证(可选,根据需求调整) ) .formLogin() // 启用表单登录 .and() .build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
额外注意事项
- 确保你的
/home接口路径和配置中的完全一致,比如是否存在大小写问题、是否有额外的上下文路径(如果Spring Boot配置了server.servlet.context-path)。 - Spring Security的授权规则是从上到下匹配,所以要把宽松的规则(比如
permitAll)放在严格规则(比如authenticated)前面,否则会被后面的规则覆盖。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

