Я включил 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 и не получая исключение?