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するしかないらしい。