Spring Boot 3.1.1中Spring Security过时方法的替代方案咨询
以下是适配Spring Boot 3.1.1(对应Spring Security 6.1+)的完整配置代码,替换所有过时方法:
@Configuration public class SecurityConfig { private static final String ADMIN = "ADMIN"; private static final String USER = "USER"; @Autowired private AuthenticationManager authenticationManager; @Bean public AuthenticationManager authManager(AuthenticationManagerBuilder authBuilder, UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) throws Exception { authBuilder.userDetailsService(userDetailsService) .passwordEncoder(bCryptPasswordEncoder); return authBuilder.build(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http // 禁用CSRF .csrf(csrf -> csrf.disable()) // 配置无状态会话 .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 配置跨域 .cors(cors -> cors.configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(Collections.singletonList("http://localhost:4200")); config.setAllowedMethods(Collections.singletonList("*")); config.setAllowCredentials(true); config.setAllowedHeaders(Collections.singletonList("*")); config.setExposedHeaders(List.of("Authorization")); config.setMaxAge(3600L); return config; })) // 配置请求授权规则 .authorizeHttpRequests(auth -> auth .requestMatchers("/login").permitAll() .requestMatchers(HttpMethod.GET, "/api/v1/list/**").permitAll() .requestMatchers(HttpMethod.DELETE, "/api/v1/delete/**").hasAuthority(ADMIN) .requestMatchers(HttpMethod.PUT, "/api/v1/update/**").hasAuthority(ADMIN) .requestMatchers(HttpMethod.GET, "/api/v1/get/**").hasAnyAuthority(ADMIN, USER) .anyRequest().authenticated() ) // 添加JWT认证过滤器 .addFilterBefore(new JWTAuthenticationFilter(authenticationManager), UsernamePasswordAuthenticationFilter.class) // 添加JWT授权过滤器 .addFilterBefore(new JWTAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } // 若未注册BCryptPasswordEncoder,需添加此Bean @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
关键过时方法替代说明
AuthenticationManager构建的.and().build():
原通过HttpSecurity.getSharedObject()获取构建器的方式已过时,改为直接注入AuthenticationManagerBuilder实例,配置用户详情服务和密码编码器后调用build()即可生成认证管理器。csrf():
原csrf().disable()链式调用替换为lambda配置csrf(csrf -> csrf.disable()),这是Spring Security 6+推荐的DSL写法,无需用.and()连接后续配置。sessionManagement():
原sessionManagement().sessionCreationPolicy(...).and()替换为sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)),用lambda封装会话管理逻辑。authorizeHttpRequests():
原授权规则的链式调用改为在authorizeHttpRequests(auth -> {...})的lambda内部完成所有规则配置,无需.and()分隔。全局
.and():
Spring Security 6+全面采用lambda DSL替代传统的.and()链式调用,每个配置块(如csrf、sessionManagement等)都通过lambda传入配置逻辑,代码结构更简洁易读。
内容的提问来源于stack exchange,提问作者Brody Gaudel

