[spring-projects/spring-boot]记录如何构造配置,以便 @Bean 方法包含在切片测试中

2024-04-10 361 views
9

你好!

我刚刚将几个服务更新到SpringBoot 2.1.3 ,并观察到​​WebFluxWebMVC与spring-security相结合的集成测试的不同行为 。

在这两种服务中都存在自定义的 SecurityConfig。

在 WebMVC 服务中,配置如下所示:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
      // custom config is here
    }
}

在 WebFlux 服务中,配置如下所示:

@Configuration
@EnableWebFluxSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
      //custom config is here
    }
}

当使用自定义 WebSecurityConfig 实现集成测试时,@WebMvcTest会调用(在配置方法中放置断点)。但为了保持活跃,必须apply(SecurityMockMvcConfigurers.springSecurity())调用MockMvcBuilder.我认为这与此处提供的文档一致: https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#test-mockmvc-setup

@WebFluxTest当使用自定义 SecurityConfiguration实现集成测试时,不会调用org.springframework.security.config.annotation.web.reactive.WebFluxSecurityConfiguration,而是使用标准。我必须@Import在测试类上使用才能使自定义 SecurityConfiguration 正常工作。

我在文档中找不到任何描述@WebFluxTest.我希望其@WebFluxTest行为类似于@WebMvcTest并使用自定义 SecurityConfiguration。

回答

2

@dkroehan@WebFluxTest应该选择自定义安全配置。您能否提供我们可以运行以重现该问题的最小示例?

9

@dkroehan 你的 Webflux 安全性不是继承的,ServerHttpSecurity所以我们无法检测到它(请注意,MVC 对应部分是从 Spring Security 的基类扩展的)。

7
2

你的Webflux安全性不是从ServerHttpSecurity继承的

我认为不应该。该ServerHttpSecuritybean 由 Spring Security 提供,而不是用户的应用程序。

1

?‍♂️

0

@wilkinsona 是对的。这是 中的一个错误WebFluxTypeExcludeFilter。它应该包括SecurityWebFilterChainbeans 而不是ServerHttpSecurity.

8

实际上,问题不仅仅是修复WebFluxTypeExcludeFilter.WebFluxTypeExcludeFilter仅适用于通过组件扫描创建的 bean。当你有这样的事情时:

@Configuration
@EnableWebFluxSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
      //custom config is here
    }
}

WebFluxTypeExcludeFilter包含@Configuration类并且SecurityWebFilterChain不是由组件扫描创建的类不会被拾取。

@dkroehan 作为一种解决方法,您可以添加@Import(SecurityConfiguration.class)测试类。

9

我们讨论了这个问题,这对于2.1.x.我们现在将记录该限制。

1

@mbhave - 谢谢你。我也遇到了这个问题。我终于通过添加让我的测试开始工作

@Import(SecurityConfig.class)
@WithMockUser

在班级层面上。

0

@mbhave 这个问题似乎已经过时了。是否有任何进展或其他解决方法不需要调整我的所有测试类?

1

最近这个问题又出现了。我想知道我们是否可以在 2.7 或早期的 2.6.x 维护版本中做一些事情?