diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java index 45ecb48c..76f454b2 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayReactiveOAuth2AutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package org.springframework.cloud.gateway.config; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.security.SecurityProperties; import org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration; @@ -43,6 +44,7 @@ import org.springframework.security.web.server.SecurityWebFilterChain; public class GatewayReactiveOAuth2AutoConfiguration { @Bean + @ConditionalOnMissingBean @ConditionalOnBean(ReactiveClientRegistrationRepository.class) public ReactiveOAuth2AuthorizedClientManager gatewayReactiveOAuth2AuthorizedClientManager( ReactiveClientRegistrationRepository clientRegistrationRepository, diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java index 32a3a5df..1da2f947 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -225,6 +225,25 @@ public class GatewayAutoConfigurationTests { }); } + @Test + public void gatewayReactiveOAuth2AuthorizedClientManagerBacksOffForCustomBean() { + new ReactiveWebApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(ReactiveSecurityAutoConfiguration.class, + ReactiveOAuth2ClientAutoConfiguration.class, GatewayReactiveOAuth2AutoConfiguration.class)) + .withUserConfiguration(TestReactiveOAuth2AuthorizedClientManagerConfig.class) + .withPropertyValues( + "spring.security.oauth2.client.provider[testprovider].authorization-uri=http://localhost", + "spring.security.oauth2.client.provider[testprovider].token-uri=http://localhost/token", + "spring.security.oauth2.client.registration[test].provider=testprovider", + "spring.security.oauth2.client.registration[test].authorization-grant-type=authorization_code", + "spring.security.oauth2.client.registration[test].redirect-uri=http://localhost/redirect", + "spring.security.oauth2.client.registration[test].client-id=login-client") + .run(context -> { + assertThat(context).hasSingleBean(ReactiveOAuth2AuthorizedClientManager.class); + assertThat(context).hasBean("myReactiveOAuth2AuthorizedClientManager"); + }); + } + @Test public void noTokenRelayFilter() { assertThatThrownBy(() -> { @@ -558,4 +577,14 @@ public class GatewayAutoConfigurationTests { } + @Configuration + protected static class TestReactiveOAuth2AuthorizedClientManagerConfig { + + @Bean + ReactiveOAuth2AuthorizedClientManager myReactiveOAuth2AuthorizedClientManager() { + return authorizeRequest -> null; + } + + } + }