Spring Security配置运行时错误:WebSecurityConfigurerAdapter类不存在
问题原因
WebSecurityConfigurerAdapter在Spring Security 5.7版本开始就被标记为弃用,到6.x版本已被完全移除,所以你在6.2.4版本中找不到这个类是正常的,官方已废弃原有继承适配器的配置方式,改用基于组件Bean的写法。
解决方案
1. 替换configure(HttpSecurity):定义SecurityFilterChain Bean
原来继承WebSecurityConfigurerAdapter重写configure(HttpSecurity)的逻辑,现在通过注册SecurityFilterChain类型的Bean实现:
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.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 配置请求权限 .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**", "/login").permitAll() .anyRequest().authenticated() ) // 配置表单登录 .formLogin(form -> form .defaultSuccessUrl("/home", true) .permitAll() ) // 配置退出登录 .logout(logout -> logout .logoutSuccessUrl("/login?logout") .permitAll() ); return http.build(); } }
2. 替换configure(AuthenticationManagerBuilder):注册UserDetailsService和PasswordEncoder Bean
原来配置用户认证的逻辑,现在通过定义UserDetailsService(用户信息来源)和PasswordEncoder(密码加密器)Bean实现:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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; @Configuration public class SecurityConfig { @Bean public UserDetailsService userDetailsService() { UserDetails admin = User.withUsername("admin") .password(passwordEncoder().encode("admin123")) .roles("ADMIN") .build(); UserDetails user = User.withUsername("user") .password(passwordEncoder().encode("user123")) .roles("USER") .build(); return new InMemoryUserDetailsManager(admin, user); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
3. 替换configure(WebSecurity):使用WebSecurityCustomizer
如果需要忽略静态资源或特定路径的安全校验,注册WebSecurityCustomizer Bean即可:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; @Configuration public class SecurityConfig { @Bean public WebSecurityCustomizer webSecurityCustomizer() { return web -> web.ignoring() .requestMatchers("/css/**", "/js/**", "/img/**", "/favicon.ico"); } }
内容的提问来源于stack exchange,提问作者devoverflow
相关产品推荐
相关产品推荐

