Spring Boot 2.3.4.RELEASEでWebFluxとSecurityを使用している際、
コントローラーなどのテストのために@WebMvcTest
を付与しているテストで
WebTestClient
でコントローラーにリクエストを行うと、何故かBasic認証を求められた。
確かにSpring Securityを利用しているプロジェクトではあるが、Basic認証などは利用していない。
原因に検討が付かなかったが、GitHubにissueが存在した。
要約すると、@WebFluxTest
では@Conroller
や@ControllerAdvice
, WebFluxConfigurer
など、コントローラー関係の@Bean
は構成されるが、@Service
の@Bean
は構成されない。
ただし、@Configuration
が付与されたクラスは@Bean
として生成はされるようだ。
そして、その中から条件に一致する@Bean
のみが生成されるらしい。
Spring SecurityのWebFlux向けのセキュリティ構成をしている場合、多くの場合ドキュメントに記載されている以下のような構成を用意することになる。
@Configuration
@EnableWebFluxSecurity
public class SecurityConfiguration {
@Bean
public SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
// do stuff
}
}
このときSecurityWebFilterChain
は生成されないが、SecurityConfiguration
と一緒に@EnableWebFluxSecurity
がスキャンされる。
@EnableWebFluxSecurity
の定義を見ると@Import(WebFluxSecurityConfiguration.class)が付与されている。
WebFluxSecurityConfiguration
はデフォルトのSecurityWebFilterChainを生成する。
こういった流れで@WebFluxTest
が付与されたテストでSpring Securityのデフォルトセキュリティが適用されるらしい。
対応策としてはプロジェクトで用意しているSecurityWebFilterChain
を生成する@Configuration
を明示的に@Import
するしかないらしい。