使用Azure Active Directory时,如何从WebSecurityConfigurerAdapter迁移到SecurityFilterChain
问题背景
WebSecurityConfigurerAdapter已被废弃,迁移至SecurityFilterChain时,项目中使用的Azure Active Directory依赖(版本4.4.1)内部仍依赖WebSecurityConfigurerAdapter相关类(AadResourceServerWebSecurityConfigurerAdapter、AadWebSecurityConfigurerAdapter、AadResourceServerConfiguration、AadWebApplicationConfiguration),导致启动时抛出冲突错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource .....
Caused by: java.lang.IllegalStateException: Found WebSecurityConfigurerAdapter as well as SecurityFilterChain. Please select just one.
项目中Azure AD相关依赖配置如下:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-active-directory</artifactId> </dependency> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>4.4.1</version> <type>pom</type> <scope>import</scope> </dependency>
可行解决方案
方案1:禁用Azure AD自动配置的WebSecurityConfigurerAdapter
通过Spring Boot的自动配置排除机制,移除Azure AD提供的相关配置类,避免其注册WebSecurityConfigurerAdapter实例:
@SpringBootApplication(exclude = { AadWebApplicationConfiguration.class, AadResourceServerConfiguration.class }) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
之后手动编写SecurityFilterChain,并整合Azure AD的认证逻辑:
- Web应用场景:手动配置OIDC客户端认证,使用
AadOidcLoginConfigurer - 资源服务器场景:手动配置JWT认证,使用
AadResourceServerConfigurer
Web应用场景示例代码:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .apply(AadOidcLoginConfigurer.aadOidcLogin()); // 整合Azure AD OIDC登录 return http.build(); }
方案2:升级Azure Spring Cloud依赖版本
后续版本(如5.x及以上)的spring-cloud-azure-starter-active-directory已完全迁移至SecurityFilterChain,不再依赖WebSecurityConfigurerAdapter。若业务允许,直接升级到最新稳定版即可解决冲突。
内容的提问来源于stack exchange,提问作者MehdiB

