При тестировании безопасности Spring приложения, включенные oauth2login, выдают IllegalArgumentException: clientRegistrationRepository не может быть нулевым - PullRequest
0 голосов
/ 20 марта 2020

Я включил oauth2login следующим образом.

  @Bean
  public SecurityWebFilterChain securityWebFilterChainCatchAll(ServerHttpSecurity http) {
    return http
        .csrf().disable()
        .authorizeExchange()
        .pathMatchers("/", "/static/**", "/favicon.ico")
        .permitAll()
        .anyExchange()
        .denyAll()
        .and()
        .oauth2Login()
        .and()
        .build();
  }

Тогда у меня есть API, защищенный следующим образом:

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http, final List<HttpSecurityConfig> configs) {
    return http
            .securityMatcher(ServerWebExchangeMatchers.pathMatchers("/api/**"))
            .authorizeExchange()
            .pathMatchers(HttpMethod.GET, "/api").permitAll()
            .anyExchange().authenticated()
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(new HttpStatusServerEntryPoint(HttpStatus.UNAUTHORIZED))
            .and()
            .build();
  }

Затем в моем application.yml я настроил собственного провайдера аутентификации как:

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            clientId: ididid
            scope: openid,email,phone,profile
            clientName: MYClient
        provider:
          cognito:
            issuerUri: SOMEURI
            usernameAttribute: username

Теперь, когда я загружаю свое приложение, все работает как положено. Проблемы начинаются, когда я хочу написать тест для моего приложения.

Мой тест помечен:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient

с автопроводкой WebTestClient и выполнен с:

webTestClient.get()
.uri("/api/something")
.exchange()
.expectStatus()
.isOk()
.expectHeader()
.contentType(ContentType.APPLICATION_JSON.getMimeType())
.expectBodyList(Map.class)
.hasSize(0);

Когда я пытаюсь запустить тест, все они терпят неудачу, так как контекст приложения не может быть создан со следующим сообщением об ошибке.

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.reactive.WebFluxSecurityConfiguration': Unsatisfied dependency expressed through method 'setSecurityWebFilterChains' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityWebFilterChainCatchAll' defined in class path resource [***]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.server.SecurityWebFilterChain]: Factory method 'securityWebFilterChainCatchAll' threw exception; nested exception is java.lang.IllegalArgumentException: clientRegistrationRepository cannot be null

Я нашел этот пример , который имеет очень хороший примеры, но все же я не могу заставить его работать. Как я хочу, чтобы мой тест работал, я задокументировал для весны mvc в посте после под заголовком

Обход аутентификации полностью с использованием Mock Mvc

Я хочу, чтобы мой тест никогда не вызывал провайдера oauth2. Я только хочу создать oauth2user с webTestClient.mutateWith(mockOAuth2Login().oauth2User(new CustomOidcUser()), который используется для вызова моих контроллеров.

Как я могу использовать @SpringBootTest с mockOAuth2Login().oauth2User, не вызывая фактического поставщика oauth2 и не получая исключение?

1 Ответ

1 голос
/ 20 марта 2020

Это может быть экземпляр https://github.com/spring-projects/spring-boot/issues/19823, который будет рассмотрен в предстоящем выпуске Spring Boot 2.3 - вы можете увидеть, что ваша проблема решена, попробовав последний этап Spring Boot.

Тем временем вы можете предоставить @MockBean для ReactiveClientRegistrationRepository самостоятельно:

@MockBean
ReactiveClientRegistrationRepository clientRegistrationRepository;

Если это не решит вашу проблему, рассмотрите возможность размещения минимального образца в GitHub.

...