From b8b8fb259212729ed2e679c2c0a38de61d2e58ce Mon Sep 17 00:00:00 2001 From: Phil Clay Date: Sun, 20 Oct 2019 13:38:42 -0700 Subject: [PATCH] Make saveAuthorizedClient save the authorized client Previously, saveAuthorizedClient never actually saved the authorized client, because it ignored the Mono returned from authorizedClientRepository.saveAuthorizedClient. Now, it does not ignore the Mono returned from authorizedClientRepository.saveAuthorizedClient, and includes it in the stream, and therefore it will properly save the authorized client. Fixes gh-7546 --- .../DefaultReactiveOAuth2AuthorizedClientManager.java | 6 ++---- ...aultReactiveOAuth2AuthorizedClientManagerTests.java | 10 +++++++++- ...th2AuthorizedClientExchangeFilterFunctionTests.java | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManager.java b/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManager.java index 399839c1388..5e64d7ba7ed 100644 --- a/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManager.java +++ b/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManager.java @@ -105,10 +105,8 @@ private Mono loadAuthorizedClient(String clientRegistrat private Mono saveAuthorizedClient(OAuth2AuthorizedClient authorizedClient, Authentication principal, ServerWebExchange serverWebExchange) { return Mono.justOrEmpty(serverWebExchange) .switchIfEmpty(Mono.defer(() -> currentServerWebExchange())) - .map(exchange -> { - this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, principal, exchange); - return authorizedClient; - }) + .flatMap(exchange -> this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, principal, exchange) + .thenReturn(authorizedClient)) .defaultIfEmpty(authorizedClient); } diff --git a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManagerTests.java b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManagerTests.java index 03f1a404792..ed04f0ca376 100644 --- a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManagerTests.java +++ b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultReactiveOAuth2AuthorizedClientManagerTests.java @@ -36,6 +36,7 @@ import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; +import reactor.test.publisher.PublisherProbe; import reactor.util.context.Context; import java.util.Collections; @@ -65,6 +66,8 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests { private Context context; private ArgumentCaptor authorizationContextCaptor; + private PublisherProbe saveAuthorizedClientProbe; + @SuppressWarnings("unchecked") @Before public void setup() { @@ -74,8 +77,9 @@ public void setup() { this.authorizedClientRepository = mock(ServerOAuth2AuthorizedClientRepository.class); when(this.authorizedClientRepository.loadAuthorizedClient( anyString(), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(Mono.empty()); + this.saveAuthorizedClientProbe = PublisherProbe.empty(); when(this.authorizedClientRepository.saveAuthorizedClient( - any(OAuth2AuthorizedClient.class), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(Mono.empty()); + any(OAuth2AuthorizedClient.class), any(Authentication.class), any(ServerWebExchange.class))).thenReturn(saveAuthorizedClientProbe.mono()); this.authorizedClientProvider = mock(ReactiveOAuth2AuthorizedClientProvider.class); when(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class))).thenReturn(Mono.empty()); this.contextAttributesMapper = mock(Function.class); @@ -187,6 +191,8 @@ public void authorizeWhenNotAuthorizedAndSupportedProviderThenAuthorized() { assertThat(authorizedClient).isSameAs(this.authorizedClient); verify(this.authorizedClientRepository).saveAuthorizedClient( eq(this.authorizedClient), eq(this.principal), eq(this.serverWebExchange)); + + saveAuthorizedClientProbe.assertWasSubscribed(); } @Test @@ -245,6 +251,7 @@ public void authorizeWhenAuthorizedAndSupportedProviderThenReauthorized() { assertThat(authorizedClient).isSameAs(reauthorizedClient); verify(this.authorizedClientRepository).saveAuthorizedClient( eq(reauthorizedClient), eq(this.principal), eq(this.serverWebExchange)); + saveAuthorizedClientProbe.assertWasSubscribed(); } @Test @@ -337,6 +344,7 @@ public void reauthorizeWhenSupportedProviderThenReauthorized() { assertThat(authorizedClient).isSameAs(reauthorizedClient); verify(this.authorizedClientRepository).saveAuthorizedClient( eq(reauthorizedClient), eq(this.principal), eq(this.serverWebExchange)); + saveAuthorizedClientProbe.assertWasSubscribed(); } @Test diff --git a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/reactive/function/client/ServerOAuth2AuthorizedClientExchangeFilterFunctionTests.java b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/reactive/function/client/ServerOAuth2AuthorizedClientExchangeFilterFunctionTests.java index eb4319642cd..abffbe7d583 100644 --- a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/reactive/function/client/ServerOAuth2AuthorizedClientExchangeFilterFunctionTests.java +++ b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/reactive/function/client/ServerOAuth2AuthorizedClientExchangeFilterFunctionTests.java @@ -140,6 +140,7 @@ public void setup() { this.clientRegistrationRepository, this.authorizedClientRepository); this.authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider); this.function = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); + when(this.authorizedClientRepository.saveAuthorizedClient(any(), any(), any())).thenReturn(Mono.empty()); } @Test