From 8584b12c8da9b73b2579df91b81ff86a49e4daa0 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 --- .../web/DefaultReactiveOAuth2AuthorizedClientManager.java | 6 ++---- ...DefaultReactiveOAuth2AuthorizedClientManagerTests.java | 8 +++++++- ...OAuth2AuthorizedClientExchangeFilterFunctionTests.java | 1 + 3 files changed, 10 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 399839c138..5e64d7ba7e 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 @@ public final class DefaultReactiveOAuth2AuthorizedClientManager implements React 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 03f1a40479..2dd4e3ed6a 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.TestOAuth2RefreshTokens; 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; @@ -64,6 +65,7 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests { private MockServerWebExchange serverWebExchange; private Context context; private ArgumentCaptor authorizationContextCaptor; + private PublisherProbe saveAuthorizedClientProbe; @SuppressWarnings("unchecked") @Before @@ -74,8 +76,9 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests { 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(this.saveAuthorizedClientProbe.mono()); this.authorizedClientProvider = mock(ReactiveOAuth2AuthorizedClientProvider.class); when(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class))).thenReturn(Mono.empty()); this.contextAttributesMapper = mock(Function.class); @@ -187,6 +190,7 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests { assertThat(authorizedClient).isSameAs(this.authorizedClient); verify(this.authorizedClientRepository).saveAuthorizedClient( eq(this.authorizedClient), eq(this.principal), eq(this.serverWebExchange)); + this.saveAuthorizedClientProbe.assertWasSubscribed(); } @Test @@ -245,6 +249,7 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests { assertThat(authorizedClient).isSameAs(reauthorizedClient); verify(this.authorizedClientRepository).saveAuthorizedClient( eq(reauthorizedClient), eq(this.principal), eq(this.serverWebExchange)); + this.saveAuthorizedClientProbe.assertWasSubscribed(); } @Test @@ -337,6 +342,7 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests { assertThat(authorizedClient).isSameAs(reauthorizedClient); verify(this.authorizedClientRepository).saveAuthorizedClient( eq(reauthorizedClient), eq(this.principal), eq(this.serverWebExchange)); + this.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 eb4319642c..abffbe7d58 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 class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests { this.clientRegistrationRepository, this.authorizedClientRepository); this.authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider); this.function = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); + when(this.authorizedClientRepository.saveAuthorizedClient(any(), any(), any())).thenReturn(Mono.empty()); } @Test