Vaadin Spring Boot部署WAR时WebSecurityConfigurerAdapter与SecurityFilterChain冲突
报错解决方案
错误触发逻辑:Spring Security 5.7版本之后正式废弃
WebSecurityConfigurerAdapter配置方式,改为推荐组件化的SecurityFilterChain配置,当Spring上下文同时检测到两种模式的安全配置Bean时,就会抛出「Found WebSecurityConfigurerAdapter as well as SecurityFilterChain. Please select just one」异常。
修复步骤
第一步:排查自定义配置冲突
检查你自定义的WebSecurityConfig类:如果配置类同时继承了WebSecurityConfigurerAdapter,又在类中定义了返回SecurityFilterChain的@Bean方法,直接删除继承WebSecurityConfigurerAdapter的逻辑,所有安全规则全部通过SecurityFilterChain配置实现。
特别注意:如果你的原有逻辑是基于WebSecurityConfigurerAdapter重写configure方法,直接把方法内的配置逻辑迁移到SecurityFilterChain的Bean方法中即可第二步:排查依赖隐式配置冲突
排查Vaadin、Okta starter的自动配置逻辑:- 首先在pom.xml的
<dependencyManagement>区块锁定Spring Security版本,与你使用的Spring Boot版本保持一致,避免多版本Security依赖共存。 - 在项目启动类的
@SpringBootApplication注解上添加排除项,关闭冲突的自动配置:
@SpringBootApplication(exclude = { org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.class, com.okta.spring.boot.autoconfigure.OktaSecurityAutoConfiguration.class })- 若使用Vaadin官方security starter,额外排除其自动注入的默认
SecurityFilterChain,改为完全使用自定义配置。
- 首先在pom.xml的
第三步:标准Security配置参考
@Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // 此处替换为你原有Okta认证、Vaadin路径放行的配置规则 http.authorizeHttpRequests(auth -> auth // 放行Vaadin内部静态资源与请求 .requestMatchers(VaadinUtils::isFrameworkInternalRequest).permitAll() .anyRequest().authenticated() ) // 配置Okta OAuth2登录逻辑 .oauth2Login(Customizer.withDefaults()); return http.build(); } // 原有WebSecurityConfigurerAdapter中定义的PasswordEncoder、UserDetailsService等,单独注册为Bean即可 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
- 第四步:WAR部署适配调整
- 确认你继承
SpringBootServletInitializer的启动类没有额外引入安全配置。 - 打包前在pom.xml中将
spring-boot-starter-tomcat的依赖scope设置为provided,同时清空Tomcat的work目录、webapps下的旧项目缓存后再部署新的WAR包。
- 确认你继承
内容的提问来源于stack exchange,提问作者JeremP
相关产品推荐
相关产品推荐

