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