mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-07-05 18:22:26 +00:00
DefaultReactiveOAuth2AuthorizedClientManager requires non-null serverWebExchange
Issue gh-7544
This commit is contained in:
parent
42ab6736e1
commit
18f48e4a16
@ -99,15 +99,16 @@ public final class DefaultReactiveOAuth2AuthorizedClientManager implements React
|
|||||||
private Mono<OAuth2AuthorizedClient> loadAuthorizedClient(String clientRegistrationId, Authentication principal, ServerWebExchange serverWebExchange) {
|
private Mono<OAuth2AuthorizedClient> loadAuthorizedClient(String clientRegistrationId, Authentication principal, ServerWebExchange serverWebExchange) {
|
||||||
return Mono.justOrEmpty(serverWebExchange)
|
return Mono.justOrEmpty(serverWebExchange)
|
||||||
.switchIfEmpty(Mono.defer(() -> currentServerWebExchange()))
|
.switchIfEmpty(Mono.defer(() -> currentServerWebExchange()))
|
||||||
|
.switchIfEmpty(Mono.error(() -> new IllegalArgumentException("serverWebExchange cannot be null")))
|
||||||
.flatMap(exchange -> this.authorizedClientRepository.loadAuthorizedClient(clientRegistrationId, principal, exchange));
|
.flatMap(exchange -> this.authorizedClientRepository.loadAuthorizedClient(clientRegistrationId, principal, exchange));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<OAuth2AuthorizedClient> saveAuthorizedClient(OAuth2AuthorizedClient authorizedClient, Authentication principal, ServerWebExchange serverWebExchange) {
|
private Mono<OAuth2AuthorizedClient> saveAuthorizedClient(OAuth2AuthorizedClient authorizedClient, Authentication principal, ServerWebExchange serverWebExchange) {
|
||||||
return Mono.justOrEmpty(serverWebExchange)
|
return Mono.justOrEmpty(serverWebExchange)
|
||||||
.switchIfEmpty(Mono.defer(() -> currentServerWebExchange()))
|
.switchIfEmpty(Mono.defer(() -> currentServerWebExchange()))
|
||||||
|
.switchIfEmpty(Mono.error(() -> new IllegalArgumentException("serverWebExchange cannot be null")))
|
||||||
.flatMap(exchange -> this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, principal, exchange)
|
.flatMap(exchange -> this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, principal, exchange)
|
||||||
.thenReturn(authorizedClient))
|
.thenReturn(authorizedClient));
|
||||||
.defaultIfEmpty(authorizedClient);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Mono<ServerWebExchange> currentServerWebExchange() {
|
private static Mono<ServerWebExchange> currentServerWebExchange() {
|
||||||
|
@ -65,6 +65,7 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
|||||||
private MockServerWebExchange serverWebExchange;
|
private MockServerWebExchange serverWebExchange;
|
||||||
private Context context;
|
private Context context;
|
||||||
private ArgumentCaptor<OAuth2AuthorizationContext> authorizationContextCaptor;
|
private ArgumentCaptor<OAuth2AuthorizationContext> authorizationContextCaptor;
|
||||||
|
private PublisherProbe<OAuth2AuthorizedClient> loadAuthorizedClientProbe;
|
||||||
private PublisherProbe<Void> saveAuthorizedClientProbe;
|
private PublisherProbe<Void> saveAuthorizedClientProbe;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@ -74,8 +75,9 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
|||||||
when(this.clientRegistrationRepository.findByRegistrationId(
|
when(this.clientRegistrationRepository.findByRegistrationId(
|
||||||
anyString())).thenReturn(Mono.empty());
|
anyString())).thenReturn(Mono.empty());
|
||||||
this.authorizedClientRepository = mock(ServerOAuth2AuthorizedClientRepository.class);
|
this.authorizedClientRepository = mock(ServerOAuth2AuthorizedClientRepository.class);
|
||||||
|
this.loadAuthorizedClientProbe = PublisherProbe.empty();
|
||||||
when(this.authorizedClientRepository.loadAuthorizedClient(
|
when(this.authorizedClientRepository.loadAuthorizedClient(
|
||||||
anyString(), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(Mono.empty());
|
anyString(), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(this.loadAuthorizedClientProbe.mono());
|
||||||
this.saveAuthorizedClientProbe = PublisherProbe.empty();
|
this.saveAuthorizedClientProbe = PublisherProbe.empty();
|
||||||
when(this.authorizedClientRepository.saveAuthorizedClient(
|
when(this.authorizedClientRepository.saveAuthorizedClient(
|
||||||
any(OAuth2AuthorizedClient.class), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(this.saveAuthorizedClientProbe.mono());
|
any(OAuth2AuthorizedClient.class), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(this.saveAuthorizedClientProbe.mono());
|
||||||
@ -131,6 +133,16 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
|||||||
.hasMessage("authorizeRequest cannot be null");
|
.hasMessage("authorizeRequest cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void authorizeWhenExchangeIsNullThenThrowIllegalArgumentException() {
|
||||||
|
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId(this.clientRegistration.getRegistrationId())
|
||||||
|
.principal(this.principal)
|
||||||
|
.build();
|
||||||
|
assertThatThrownBy(() -> this.authorizedClientManager.authorize(authorizeRequest).block())
|
||||||
|
.isInstanceOf(IllegalArgumentException.class)
|
||||||
|
.hasMessage("serverWebExchange cannot be null");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void authorizeWhenClientRegistrationNotFoundThenThrowIllegalArgumentException() {
|
public void authorizeWhenClientRegistrationNotFoundThenThrowIllegalArgumentException() {
|
||||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("invalid-registration-id")
|
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("invalid-registration-id")
|
||||||
@ -162,7 +174,8 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
|||||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||||
|
|
||||||
assertThat(authorizedClient).isNull();
|
assertThat(authorizedClient).isNull();
|
||||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
this.loadAuthorizedClientProbe.assertWasSubscribed();
|
||||||
|
this.saveAuthorizedClientProbe.assertWasNotSubscribed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@ -193,38 +206,14 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
|||||||
this.saveAuthorizedClientProbe.assertWasSubscribed();
|
this.saveAuthorizedClientProbe.assertWasSubscribed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void authorizeWhenNotAuthorizedAndSupportedProviderAndExchangeUnavailableThenAuthorizedButNotSaved() {
|
|
||||||
when(this.clientRegistrationRepository.findByRegistrationId(
|
|
||||||
eq(this.clientRegistration.getRegistrationId()))).thenReturn(Mono.just(this.clientRegistration));
|
|
||||||
|
|
||||||
when(this.authorizedClientProvider.authorize(
|
|
||||||
any(OAuth2AuthorizationContext.class))).thenReturn(Mono.just(this.authorizedClient));
|
|
||||||
|
|
||||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId(this.clientRegistration.getRegistrationId())
|
|
||||||
.principal(this.principal)
|
|
||||||
.build();
|
|
||||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest).block();
|
|
||||||
|
|
||||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
|
||||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
|
||||||
|
|
||||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
|
||||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
|
||||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
|
||||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
|
||||||
|
|
||||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
|
||||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Test
|
@Test
|
||||||
public void authorizeWhenAuthorizedAndSupportedProviderThenReauthorized() {
|
public void authorizeWhenAuthorizedAndSupportedProviderThenReauthorized() {
|
||||||
when(this.clientRegistrationRepository.findByRegistrationId(
|
when(this.clientRegistrationRepository.findByRegistrationId(
|
||||||
eq(this.clientRegistration.getRegistrationId()))).thenReturn(Mono.just(this.clientRegistration));
|
eq(this.clientRegistration.getRegistrationId()))).thenReturn(Mono.just(this.clientRegistration));
|
||||||
|
this.loadAuthorizedClientProbe = PublisherProbe.of(Mono.just(this.authorizedClient));
|
||||||
when(this.authorizedClientRepository.loadAuthorizedClient(
|
when(this.authorizedClientRepository.loadAuthorizedClient(
|
||||||
eq(this.clientRegistration.getRegistrationId()), eq(this.principal), eq(this.serverWebExchange))).thenReturn(Mono.just(this.authorizedClient));
|
eq(this.clientRegistration.getRegistrationId()), eq(this.principal), eq(this.serverWebExchange))).thenReturn(this.loadAuthorizedClientProbe.mono());
|
||||||
|
|
||||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(
|
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(
|
||||||
this.clientRegistration, this.principal.getName(),
|
this.clientRegistration, this.principal.getName(),
|
||||||
@ -313,7 +302,7 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
|||||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||||
|
|
||||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
this.saveAuthorizedClientProbe.assertWasNotSubscribed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user