You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的自动配置逻辑:

    1. 首先在pom.xml的<dependencyManagement>区块锁定Spring Security版本,与你使用的Spring Boot版本保持一致,避免多版本Security依赖共存。
    2. 在项目启动类的@SpringBootApplication注解上添加排除项,关闭冲突的自动配置:
    @SpringBootApplication(exclude = {
        org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.class,
        com.okta.spring.boot.autoconfigure.OktaSecurityAutoConfiguration.class
    })
    
    1. 若使用Vaadin官方security starter,额外排除其自动注入的默认SecurityFilterChain,改为完全使用自定义配置。
  • 第三步:标准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部署适配调整
    1. 确认你继承SpringBootServletInitializer的启动类没有额外引入安全配置。
    2. 打包前在pom.xml中将spring-boot-starter-tomcat的依赖scope设置为provided,同时清空Tomcat的work目录、webapps下的旧项目缓存后再部署新的WAR包。

内容的提问来源于stack exchange,提问作者JeremP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 11:27:03