spring-security 使用Servlet应用程序的WebTestClient模拟OAuth2客户端会导致httpHandlerBuilder为空

6tr1vspr  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(120)

我的Sping Boot 应用程序通过使用spring-boot-starter-oauth2-client依赖关系充当OAuth2客户端。
现在,我想编写一个集成测试(@SpringBootTest)来验证受OAuth2保护的REST端点的行为。Testing OAuth 2.0 Clients文档描述了可以使用mutateWith(mockOAuth2Client())来模拟通过OAuth2进行的登录。

public class UserIT {

  @Autowired
  private WebTestClient webTestClient;

  @Test
  void test() {
    webTestClient
      .mutateWith(mockOAuth2Client("keycloak"))
      .get()
      .uri("/api/user/1345")
      .exchange()
      .expectStatus().isOk();
  }
}

但是,测试失败,并显示以下消息:

java.lang.NullPointerException: Cannot invoke "org.springframework.web.server.adapter.WebHttpHandlerBuilder.filters(java.util.function.Consumer)" because "httpHandlerBuilder" is null
    at org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers$OAuth2ClientMutator.afterConfigurerAdded(SecurityMockServerConfigurers.java:1113)
    at org.springframework.test.web.reactive.server.DefaultWebTestClientBuilder.apply(DefaultWebTestClientBuilder.java:265)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient.mutateWith(DefaultWebTestClient.java:167)

据我所知,这个WebTestClient设置只适合于“React式应用程序”,而我的应用程序是一个“Servlet应用程序”。不幸的是,我找不到如何为Servlet应用程序模拟这个OAuth2客户机的必要信息。

lp0sw83n

lp0sw83n1#

我能够使用以下测试配置成功运行您的@Autowired@Test代码:

@Configuration
@ComponentScan
public class TestConfig {

    @Bean
    public WebTestClient webTestClient(ApplicationContext applicationContext) {
        return WebTestClient.bindToApplicationContext(applicationContext).build();
    }

    @Bean
    public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange().anyExchange().permitAll();
        return http.build();
    }
}

相关问题