From 9b7fe677df10a91885705fad09dc3ff9f98847b0 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Wed, 12 Oct 2022 18:08:26 +0800 Subject: [PATCH 1/6] Move "getPrivateFieldValue" into a new class: PrivateFieldValueGetter. --- .../cloud/autoconfigure/PrivateFieldGetter.java | 16 ++++++++++++++++ .../useragent/util/UserAgentTestUtil.java | 14 ++------------ 2 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java new file mode 100644 index 000000000000..ab149a9a6c3c --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java @@ -0,0 +1,16 @@ +package com.azure.spring.cloud.autoconfigure; + +import java.lang.reflect.Field; + +public class PrivateFieldGetter { + + public static Object getField(Class clazz, String fieldName, Object object) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(object); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java index 65118504df44..27d7143d9b25 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java @@ -8,25 +8,15 @@ import com.azure.core.http.policy.HttpPipelinePolicy; import com.azure.core.http.policy.UserAgentPolicy; -import java.lang.reflect.Field; +import static com.azure.spring.cloud.autoconfigure.PrivateFieldGetter.getField; public class UserAgentTestUtil { - public static Object getPrivateFieldValue(Class clazz, String fieldName, Object object) { - try { - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(object); - } catch (NoSuchFieldException | IllegalAccessException e) { - return null; - } - } - public static String getUserAgent(HttpPipeline pipeline) { for (int i = 0; i < pipeline.getPolicyCount(); i++) { HttpPipelinePolicy policy = pipeline.getPolicy(i); if (policy instanceof UserAgentPolicy) { - return (String) getPrivateFieldValue(UserAgentPolicy.class, "userAgent", policy); + return (String) getField(UserAgentPolicy.class, "userAgent", policy); } } return null; From c4edde3941f5d0489417457936c88dc32f140eb1 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 14 Oct 2022 10:28:15 +0800 Subject: [PATCH 2/6] Delete PrivateFieldValueGetter, Use ReflectionUtils instead. --- .../AbstractAzureServiceConfigurationTests.java | 6 +++--- .../cloud/autoconfigure/PrivateFieldGetter.java | 16 ---------------- .../useragent/CosmosUserAgentTests.java | 4 ++-- .../useragent/amqp/EventHubsUserAgentTests.java | 6 +++--- .../amqp/EventProcessorUserAgentTests.java | 6 +++--- .../useragent/amqp/ServiceBusUserAgentTests.java | 4 ++-- .../ServiceBusProcessorUserAgentTests.java | 6 +++--- .../ServiceBusReceiverUserAgentTests.java | 6 +++--- .../ServiceBusSenderUserAgentTests.java | 6 +++--- ...ServiceBusSessionProcessorUserAgentTests.java | 6 +++--- .../ServiceBusSessionReceiverUserAgentTests.java | 6 +++--- .../useragent/util/UserAgentTestUtil.java | 2 +- 12 files changed, 29 insertions(+), 45 deletions(-) delete mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AbstractAzureServiceConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AbstractAzureServiceConfigurationTests.java index cb0f0d422052..13fdcb1ef7d4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AbstractAzureServiceConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/AbstractAzureServiceConfigurationTests.java @@ -13,7 +13,6 @@ import com.azure.spring.cloud.autoconfigure.context.AzureTokenCredentialAutoConfiguration; import com.azure.spring.cloud.core.implementation.credential.resolver.AzureTokenCredentialResolver; import com.azure.spring.cloud.core.implementation.factory.AbstractAzureServiceClientBuilderFactory; -import com.azure.spring.cloud.core.implementation.util.ReflectionUtils; import com.azure.spring.cloud.core.properties.AzureProperties; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -21,6 +20,7 @@ import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; public abstract class AbstractAzureServiceConfigurationTests, @@ -105,12 +105,12 @@ private void assertSovereignCloudsSetInCredential(AssertableApplicationConte } private AzureTokenCredentialResolver getAzureTokenCredentialResolver(T builderFactory) { - return (AzureTokenCredentialResolver) ReflectionUtils.getField(getBuilderFactoryType(), + return (AzureTokenCredentialResolver) getField(getBuilderFactoryType(), "tokenCredentialResolver", builderFactory); } private IdentityClient getIdentityClient(TokenCredential credential) { - return (IdentityClient) ReflectionUtils.getField(credential.getClass(), "identityClient", credential); + return (IdentityClient) getField(credential.getClass(), "identityClient", credential); } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java deleted file mode 100644 index ab149a9a6c3c..000000000000 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/PrivateFieldGetter.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.azure.spring.cloud.autoconfigure; - -import java.lang.reflect.Field; - -public class PrivateFieldGetter { - - public static Object getField(Class clazz, String fieldName, Object object) { - try { - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(object); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new IllegalArgumentException(e); - } - } -} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/CosmosUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/CosmosUserAgentTests.java index 187764bdd973..4f2e34286303 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/CosmosUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/CosmosUserAgentTests.java @@ -9,7 +9,6 @@ import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.cosmos.AzureCosmosAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.cosmos.properties.AzureCosmosProperties; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.cosmos.CosmosClientBuilderFactory; import org.junit.jupiter.api.Assertions; @@ -17,6 +16,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -41,7 +41,7 @@ void userAgentTest() { assertThat(context).hasSingleBean(CosmosAsyncClient.class); CosmosClientBuilder builder = context.getBean(CosmosClientBuilder.class); - String userAgent = (String) UserAgentTestUtil.getPrivateFieldValue(CosmosClientBuilder.class, "userAgentSuffix", builder); + String userAgent = (String) getField(CosmosClientBuilder.class, "userAgentSuffix", builder); Assertions.assertNotNull(userAgent); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_COSMOS, userAgent); }); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventHubsUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventHubsUserAgentTests.java index 01024fb0d899..9ffa42163c8a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventHubsUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventHubsUserAgentTests.java @@ -12,7 +12,6 @@ import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.eventhubs.AzureEventHubsAutoConfiguration; import com.azure.spring.cloud.autoconfigure.eventhubs.TestCheckpointStore; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.eventhubs.consumer.EventHubsErrorHandler; import com.azure.spring.cloud.service.eventhubs.consumer.EventHubsRecordMessageListener; @@ -21,6 +20,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class EventHubsUserAgentTests { @@ -45,8 +45,8 @@ void userAgentTest() { assertThat(context).hasSingleBean(EventHubConsumerClient.class); EventProcessorClientBuilder eventProcessorClientBuilder = context.getBean(EventProcessorClientBuilder.class); - EventHubClientBuilder eventHubClientBuilder = (EventHubClientBuilder) UserAgentTestUtil.getPrivateFieldValue(EventProcessorClientBuilder.class, "eventHubClientBuilder", eventProcessorClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(EventHubClientBuilder.class, "clientOptions", eventHubClientBuilder); + EventHubClientBuilder eventHubClientBuilder = (EventHubClientBuilder) getField(EventProcessorClientBuilder.class, "eventHubClientBuilder", eventProcessorClientBuilder); + ClientOptions options = (ClientOptions) getField(EventHubClientBuilder.class, "clientOptions", eventHubClientBuilder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_EVENT_HUBS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventProcessorUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventProcessorUserAgentTests.java index b2da54a86cea..cd7eff1df734 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventProcessorUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/EventProcessorUserAgentTests.java @@ -11,7 +11,6 @@ import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.eventhubs.AzureEventHubsAutoConfiguration; import com.azure.spring.cloud.autoconfigure.eventhubs.TestCheckpointStore; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.eventhubs.consumer.EventHubsErrorHandler; import com.azure.spring.cloud.service.eventhubs.consumer.EventHubsRecordMessageListener; @@ -21,6 +20,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class EventProcessorUserAgentTests { @@ -45,8 +45,8 @@ void userAgentTest() { assertThat(context).hasSingleBean(EventProcessorClient.class); EventProcessorClientBuilder eventProcessorClientBuilder = context.getBean(EventProcessorClientBuilder.class); - EventHubClientBuilder eventHubClientBuilder = (EventHubClientBuilder) UserAgentTestUtil.getPrivateFieldValue(EventProcessorClientBuilder.class, "eventHubClientBuilder", eventProcessorClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(EventHubClientBuilder.class, "clientOptions", eventHubClientBuilder); + EventHubClientBuilder eventHubClientBuilder = (EventHubClientBuilder) getField(EventProcessorClientBuilder.class, "eventHubClientBuilder", eventProcessorClientBuilder); + ClientOptions options = (ClientOptions) getField(EventHubClientBuilder.class, "clientOptions", eventHubClientBuilder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_EVENT_HUBS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/ServiceBusUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/ServiceBusUserAgentTests.java index d588e85c82f6..bdab94fca87c 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/ServiceBusUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/ServiceBusUserAgentTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider; import com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusClientBuilderFactory; @@ -16,6 +15,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class ServiceBusUserAgentTests { @@ -35,7 +35,7 @@ void userAgentTest() { assertThat(context).hasSingleBean(StaticConnectionStringProvider.class); ServiceBusClientBuilder builder = context.getBean(ServiceBusClientBuilder.class); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.class, "clientOptions", builder); + ClientOptions options = (ClientOptions) getField(ServiceBusClientBuilder.class, "clientOptions", builder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_SERVICE_BUS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusProcessorUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusProcessorUserAgentTests.java index 30527e68a6c7..59c3151338db 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusProcessorUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusProcessorUserAgentTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusProcessorClientBuilderFactory; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler; @@ -17,6 +16,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class ServiceBusProcessorUserAgentTests { @@ -52,8 +52,8 @@ void userAgentTest(String... propertyValues) { assertThat(context).hasSingleBean(ServiceBusClientBuilder.ServiceBusProcessorClientBuilder.class); ServiceBusClientBuilder.ServiceBusProcessorClientBuilder processorClientBuilder = context.getBean(ServiceBusClientBuilder.ServiceBusProcessorClientBuilder.class); - ServiceBusClientBuilder builder = (ServiceBusClientBuilder) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.ServiceBusProcessorClientBuilder.class, "this$0", processorClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.class, "clientOptions", builder); + ServiceBusClientBuilder builder = (ServiceBusClientBuilder) getField(ServiceBusClientBuilder.ServiceBusProcessorClientBuilder.class, "this$0", processorClientBuilder); + ClientOptions options = (ClientOptions) getField(ServiceBusClientBuilder.class, "clientOptions", builder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_SERVICE_BUS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusReceiverUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusReceiverUserAgentTests.java index ce385a702950..f1e3cf229507 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusReceiverUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusReceiverUserAgentTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusReceiverClientBuilderFactory; import org.junit.jupiter.api.Assertions; @@ -15,6 +14,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class ServiceBusReceiverUserAgentTests { @@ -48,8 +48,8 @@ void userAgentTest(String... propertyValues) { assertThat(context).hasSingleBean(ServiceBusClientBuilder.ServiceBusReceiverClientBuilder.class); ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverClientBuilder = context.getBean(ServiceBusClientBuilder.ServiceBusReceiverClientBuilder.class); - ServiceBusClientBuilder builder = (ServiceBusClientBuilder) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.ServiceBusReceiverClientBuilder.class, "this$0", receiverClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.class, "clientOptions", builder); + ServiceBusClientBuilder builder = (ServiceBusClientBuilder) getField(ServiceBusClientBuilder.ServiceBusReceiverClientBuilder.class, "this$0", receiverClientBuilder); + ClientOptions options = (ClientOptions) getField(ServiceBusClientBuilder.class, "clientOptions", builder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_SERVICE_BUS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSenderUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSenderUserAgentTests.java index 011d58280abf..e8a0e6bbc4f3 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSenderUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSenderUserAgentTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusSenderClientBuilderFactory; import org.junit.jupiter.api.Assertions; @@ -15,6 +14,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class ServiceBusSenderUserAgentTests { @@ -48,8 +48,8 @@ void userAgentTest(String... propertyValues) { assertThat(context).hasSingleBean(ServiceBusClientBuilder.ServiceBusSenderClientBuilder.class); ServiceBusClientBuilder.ServiceBusSenderClientBuilder serviceBusSenderClientBuilder = context.getBean(ServiceBusClientBuilder.ServiceBusSenderClientBuilder.class); - ServiceBusClientBuilder builder = (ServiceBusClientBuilder) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.ServiceBusSenderClientBuilder.class, "this$0", serviceBusSenderClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.class, "clientOptions", builder); + ServiceBusClientBuilder builder = (ServiceBusClientBuilder) getField(ServiceBusClientBuilder.ServiceBusSenderClientBuilder.class, "this$0", serviceBusSenderClientBuilder); + ClientOptions options = (ClientOptions) getField(ServiceBusClientBuilder.class, "clientOptions", builder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_SERVICE_BUS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionProcessorUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionProcessorUserAgentTests.java index 13eb94575ee8..190604a0cc90 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionProcessorUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionProcessorUserAgentTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusSessionProcessorClientBuilderFactory; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler; @@ -17,6 +16,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class ServiceBusSessionProcessorUserAgentTests { @@ -54,8 +54,8 @@ void userAgentTest(String... propertyValues) { assertThat(context).hasSingleBean(ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder.class); ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder processorClientBuilder = context.getBean(ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder.class); - ServiceBusClientBuilder builder = (ServiceBusClientBuilder) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder.class, "this$0", processorClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.class, "clientOptions", builder); + ServiceBusClientBuilder builder = (ServiceBusClientBuilder) getField(ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder.class, "this$0", processorClientBuilder); + ClientOptions options = (ClientOptions) getField(ServiceBusClientBuilder.class, "clientOptions", builder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_SERVICE_BUS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionReceiverUserAgentTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionReceiverUserAgentTests.java index ff0fd587345d..78ea3e00fb55 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionReceiverUserAgentTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/amqp/servicebus/ServiceBusSessionReceiverUserAgentTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.servicebus.AzureServiceBusAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.useragent.util.UserAgentTestUtil; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.service.implementation.servicebus.factory.ServiceBusSessionReceiverClientBuilderFactory; import org.junit.jupiter.api.Assertions; @@ -15,6 +14,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; class ServiceBusSessionReceiverUserAgentTests { @@ -50,8 +50,8 @@ void userAgentTest(String... propertyValues) { assertThat(context).hasSingleBean(ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder.class); ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder receiverClientBuilder = context.getBean(ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder.class); - ServiceBusClientBuilder builder = (ServiceBusClientBuilder) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder.class, "this$0", receiverClientBuilder); - ClientOptions options = (ClientOptions) UserAgentTestUtil.getPrivateFieldValue(ServiceBusClientBuilder.class, "clientOptions", builder); + ServiceBusClientBuilder builder = (ServiceBusClientBuilder) getField(ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder.class, "this$0", receiverClientBuilder); + ClientOptions options = (ClientOptions) getField(ServiceBusClientBuilder.class, "clientOptions", builder); Assertions.assertNotNull(options); Assertions.assertEquals(AzureSpringIdentifier.AZURE_SPRING_SERVICE_BUS, options.getApplicationId()); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java index 27d7143d9b25..99eee973c70a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/useragent/util/UserAgentTestUtil.java @@ -8,7 +8,7 @@ import com.azure.core.http.policy.HttpPipelinePolicy; import com.azure.core.http.policy.UserAgentPolicy; -import static com.azure.spring.cloud.autoconfigure.PrivateFieldGetter.getField; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; public class UserAgentTestUtil { From 691228629dce4b0fe523e28bc0559d005ac5bac4 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 14 Oct 2022 14:00:58 +0800 Subject: [PATCH 3/6] Fix #31218: RestTemplate is not well configured when jwkResolver is null --- .../AadOAuth2ClientConfiguration.java | 27 ++++---- .../AadRestTemplateCreatorTest.java | 26 +------- ...tTemplateProxyCustomizerConfiguration.java | 31 +++++++++ .../AadOAuth2ClientConfigurationTests.java | 65 +++++++++++++++++++ 4 files changed, 108 insertions(+), 41 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/RestTemplateProxyCustomizerConfiguration.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java index a6d8369d2253..7a3f0918e737 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java @@ -142,12 +142,12 @@ JwtBearerOAuth2AuthorizedClientProvider azureAdJwtBearerProvider( ObjectProvider resolvers) { JwtBearerOAuth2AuthorizedClientProvider provider = new JwtBearerOAuth2AuthorizedClientProvider(); OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); + DefaultJwtBearerTokenResponseClient responseClient = new DefaultJwtBearerTokenResponseClient(); + responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); AadJwtBearerGrantRequestEntityConverter jwtBearerConverter = new AadJwtBearerGrantRequestEntityConverter(); if (resolver != null) { jwtBearerConverter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); } - DefaultJwtBearerTokenResponseClient responseClient = new DefaultJwtBearerTokenResponseClient(); - responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); responseClient.setRequestEntityConverter(jwtBearerConverter); provider.setAccessTokenResponseClient(responseClient); return provider; @@ -159,47 +159,42 @@ RefreshTokenOAuth2AuthorizedClientProvider azureRefreshTokenProvider( ObjectProvider resolvers) { RefreshTokenOAuth2AuthorizedClientProvider provider = new RefreshTokenOAuth2AuthorizedClientProvider(); OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); + DefaultRefreshTokenTokenResponseClient responseClient = new DefaultRefreshTokenTokenResponseClient(); + responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2RefreshTokenGrantRequestEntityConverter converter = new OAuth2RefreshTokenGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - - DefaultRefreshTokenTokenResponseClient responseClient = new DefaultRefreshTokenTokenResponseClient(); - responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); responseClient.setRequestEntityConverter(converter); - provider.setAccessTokenResponseClient(responseClient); } + provider.setAccessTokenResponseClient(responseClient); return provider; } private void passwordGrantBuilderAccessTokenResponseClientCustomizer( OAuth2AuthorizedClientProviderBuilder.PasswordGrantBuilder builder, OAuth2ClientAuthenticationJwkResolver resolver) { + DefaultPasswordTokenResponseClient client = new DefaultPasswordTokenResponseClient(); + client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2PasswordGrantRequestEntityConverter converter = new OAuth2PasswordGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - - DefaultPasswordTokenResponseClient client = new DefaultPasswordTokenResponseClient(); - client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); client.setRequestEntityConverter(converter); - - builder.accessTokenResponseClient(client); } + builder.accessTokenResponseClient(client); } private void clientCredentialsGrantBuilderAccessTokenResponseClientCustomizer( OAuth2AuthorizedClientProviderBuilder.ClientCredentialsGrantBuilder builder, OAuth2ClientAuthenticationJwkResolver resolver) { + DefaultClientCredentialsTokenResponseClient client = new DefaultClientCredentialsTokenResponseClient(); + client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2ClientCredentialsGrantRequestEntityConverter converter = new OAuth2ClientCredentialsGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - - DefaultClientCredentialsTokenResponseClient client = new DefaultClientCredentialsTokenResponseClient(); - client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); client.setRequestEntityConverter(converter); - - builder.accessTokenResponseClient(client); } + builder.accessTokenResponseClient(client); } private AadAzureDelegatedOAuth2AuthorizedClientProvider azureDelegatedOAuth2AuthorizedClientProvider( diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java index 054a22267433..eb4e062e150c 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/AadRestTemplateCreatorTest.java @@ -7,10 +7,6 @@ import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.boot.web.client.RestTemplateCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; @@ -18,14 +14,12 @@ import org.springframework.web.client.ResponseErrorHandler; import org.springframework.web.client.RestTemplate; -import java.net.InetSocketAddress; -import java.net.Proxy; import java.util.List; import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadRestTemplateCreator.createOAuth2AccessTokenResponseClientRestTemplate; import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadRestTemplateCreator.createOAuth2ErrorResponseHandledRestTemplate; import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadRestTemplateCreator.createRestTemplate; -import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadRestTemplateCreatorTest.RestTemplateProxyCustomizerConfiguration.FACTORY; +import static com.azure.spring.cloud.autoconfigure.aad.implementation.RestTemplateProxyCustomizerConfiguration.FACTORY; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -81,22 +75,4 @@ static boolean hasItemOfClass(List list, Class clazz) { .anyMatch(item -> item.getClass().equals(clazz)); } - @Configuration - static class RestTemplateProxyCustomizerConfiguration { - - static final SimpleClientHttpRequestFactory FACTORY = createProxyFactory(); - - @Bean - public RestTemplateCustomizer proxyRestTemplateCustomizer() { - return (RestTemplate restTemplate) -> restTemplate.setRequestFactory(FACTORY); - } - - static SimpleClientHttpRequestFactory createProxyFactory() { - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8080)); - SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); - factory.setProxy(proxy); - return factory; - } - } - } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/RestTemplateProxyCustomizerConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/RestTemplateProxyCustomizerConfiguration.java new file mode 100644 index 000000000000..2ba71b071fb3 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/RestTemplateProxyCustomizerConfiguration.java @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.aad.implementation; + +import org.springframework.boot.web.client.RestTemplateCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.net.InetSocketAddress; +import java.net.Proxy; + +@Configuration +public class RestTemplateProxyCustomizerConfiguration { + + public static final SimpleClientHttpRequestFactory FACTORY = createProxyFactory(); + + @Bean + public RestTemplateCustomizer proxyRestTemplateCustomizer() { + return (RestTemplate restTemplate) -> restTemplate.setRequestFactory(FACTORY); + } + + static SimpleClientHttpRequestFactory createProxyFactory() { + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8080)); + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setProxy(proxy); + return factory; + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java index 823343555450..8b8c26ef62df 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java @@ -5,8 +5,10 @@ import com.azure.spring.cloud.autoconfigure.aad.AadClientRegistrationRepository; import com.azure.spring.cloud.autoconfigure.aad.configuration.AadOAuth2ClientConfiguration; +import com.azure.spring.cloud.autoconfigure.aad.implementation.RestTemplateProxyCustomizerConfiguration; import com.azure.spring.cloud.autoconfigure.aad.implementation.TestJwks; import com.azure.spring.cloud.autoconfigure.aad.implementation.webapi.AadJwtBearerGrantRequestEntityConverter; +import com.azure.spring.cloud.autoconfigure.aad.implementation.webapp.AadAzureDelegatedOAuth2AuthorizedClientProvider; import com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties; import com.nimbusds.jose.jwk.JWK; import com.nimbusds.jose.jwk.RSAKey; @@ -16,28 +18,39 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.context.ApplicationContext; import org.springframework.core.convert.converter.Converter; +import org.springframework.security.oauth2.client.AuthorizationCodeOAuth2AuthorizedClientProvider; +import org.springframework.security.oauth2.client.DelegatingOAuth2AuthorizedClientProvider; import org.springframework.security.oauth2.client.JwtBearerOAuth2AuthorizedClientProvider; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider; import org.springframework.security.oauth2.client.endpoint.DefaultJwtBearerTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequest; import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequestEntityConverter; import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; import java.util.Arrays; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import static com.azure.spring.cloud.autoconfigure.aad.implementation.RestTemplateProxyCustomizerConfiguration.FACTORY; import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.oauthClientAndResourceServerRunner; import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.resourceServerContextRunner; import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.resourceServerWithOboContextRunner; import static com.azure.spring.cloud.autoconfigure.aad.implementation.WebApplicationContextRunnerUtils.webApplicationContextRunner; +import static com.azure.spring.cloud.core.implementation.util.ReflectionUtils.getField; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; @@ -223,6 +236,58 @@ void customConverterInJwtBearerOAuth2AuthorizedClientProviderWhenUsingPrivateKey }); } + @Test + void restTemplateWellConfiguredForAllOAuth2AuthorizedClientProvidersWhenNotUsingPrivateKeyJwtMethod() { + resourceServerWithOboContextRunner() + .withUserConfiguration(AadOAuth2ClientConfiguration.class, RestTemplateProxyCustomizerConfiguration.class) + .run(context -> { + assertThat(context).doesNotHaveBean(OAuth2ClientAuthenticationJwkResolver.class); + assertRestTemplateWellConfiguredForAllOAuth2AuthorizedClientProviders(context); + }); + } + + @Test + void restTemplateWellConfiguredForAllOAuth2AuthorizedClientProvidersWhenUsingPrivateKeyJwtMethod() { + resourceServerWithOboContextRunner() + .withPropertyValues( + "spring.cloud.azure.active-directory.enabled=true", + "spring.cloud.azure.active-directory.credential.client-certificate-path=/test/test.pfx", + "spring.cloud.azure.active-directory.credential.client-certificate-password=test", + "spring.cloud.azure.active-directory.authorization-clients.graph.client-authentication-method=private_key_jwt", + "spring.cloud.azure.active-directory.authorization-clients.graph.scopes=https://graph.microsoft.com/User.Read", + "spring.cloud.azure.active-directory.authorization-clients.graph.authorization-grant-type=urn:ietf:params:oauth:grant-type:jwt-bearer", + "spring.cloud.azure.active-directory.authorization-clients.graph.scopes=api://52261059-e515-488e-84fd-a09a3f372814/File.Read" + ) + .withUserConfiguration(AadOAuth2ClientConfiguration.class, RestTemplateProxyCustomizerConfiguration.class) + .run(context -> { + assertThat(context).hasSingleBean(OAuth2ClientAuthenticationJwkResolver.class); + assertRestTemplateWellConfiguredForAllOAuth2AuthorizedClientProviders(context); + }); + } + + private static void assertRestTemplateWellConfiguredForAllOAuth2AuthorizedClientProviders(ApplicationContext context) { + List providers = getAllOAuth2AuthorizedClientProviderThatShouldConfiguredRestTemplate(context); + assertEquals(4, providers.size()); + providers.forEach(provider -> { + OAuth2AccessTokenResponseClient client = (OAuth2AccessTokenResponseClient)getField(provider.getClass(), "accessTokenResponseClient", provider); + RestTemplate restTemplate = (RestTemplate)getField(client.getClass(), "restOperations", client); + assertEquals(FACTORY, restTemplate.getRequestFactory()); + }); + } + + @SuppressWarnings("unchecked") + private static List getAllOAuth2AuthorizedClientProviderThatShouldConfiguredRestTemplate(ApplicationContext context) { + final DefaultOAuth2AuthorizedClientManager manager = context.getBean(DefaultOAuth2AuthorizedClientManager.class); + DelegatingOAuth2AuthorizedClientProvider delegatingProvider = + (DelegatingOAuth2AuthorizedClientProvider)getField(DefaultOAuth2AuthorizedClientManager.class, "authorizedClientProvider", manager); + List providers = + (List)getField(DelegatingOAuth2AuthorizedClientProvider.class, "authorizedClientProviders", delegatingProvider); + return providers.stream() + .filter(provider -> !(provider instanceof AuthorizationCodeOAuth2AuthorizedClientProvider)) + .filter(provider -> !(provider instanceof AadAzureDelegatedOAuth2AuthorizedClientProvider)) + .collect(Collectors.toList()); + } + @SuppressWarnings("unchecked") private MultiValueMap convertParameters(JwtBearerOAuth2AuthorizedClientProvider jwtBearerProvider, ClientRegistrationRepository clientRepository) { From 15e44639c73372b64cddf82ac534af0c0f1d6710 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 14 Oct 2022 14:03:41 +0800 Subject: [PATCH 4/6] Keep same style in variable name: 1. Use "converter" instead of "jwtBearerConverter". 2. Use "client" instead of "responseClient". --- .../AadOAuth2ClientConfiguration.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java index 7a3f0918e737..453c36bad80f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/configuration/AadOAuth2ClientConfiguration.java @@ -142,14 +142,14 @@ JwtBearerOAuth2AuthorizedClientProvider azureAdJwtBearerProvider( ObjectProvider resolvers) { JwtBearerOAuth2AuthorizedClientProvider provider = new JwtBearerOAuth2AuthorizedClientProvider(); OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); - DefaultJwtBearerTokenResponseClient responseClient = new DefaultJwtBearerTokenResponseClient(); - responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); - AadJwtBearerGrantRequestEntityConverter jwtBearerConverter = new AadJwtBearerGrantRequestEntityConverter(); + DefaultJwtBearerTokenResponseClient client = new DefaultJwtBearerTokenResponseClient(); + client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); + AadJwtBearerGrantRequestEntityConverter converter = new AadJwtBearerGrantRequestEntityConverter(); if (resolver != null) { - jwtBearerConverter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); + converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); } - responseClient.setRequestEntityConverter(jwtBearerConverter); - provider.setAccessTokenResponseClient(responseClient); + client.setRequestEntityConverter(converter); + provider.setAccessTokenResponseClient(client); return provider; } @@ -159,14 +159,14 @@ RefreshTokenOAuth2AuthorizedClientProvider azureRefreshTokenProvider( ObjectProvider resolvers) { RefreshTokenOAuth2AuthorizedClientProvider provider = new RefreshTokenOAuth2AuthorizedClientProvider(); OAuth2ClientAuthenticationJwkResolver resolver = resolvers.getIfUnique(); - DefaultRefreshTokenTokenResponseClient responseClient = new DefaultRefreshTokenTokenResponseClient(); - responseClient.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); + DefaultRefreshTokenTokenResponseClient client = new DefaultRefreshTokenTokenResponseClient(); + client.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder)); if (resolver != null) { OAuth2RefreshTokenGrantRequestEntityConverter converter = new OAuth2RefreshTokenGrantRequestEntityConverter(); converter.addParametersConverter(new AadJwtClientAuthenticationParametersConverter<>(resolver::resolve)); - responseClient.setRequestEntityConverter(converter); + client.setRequestEntityConverter(converter); } - provider.setAccessTokenResponseClient(responseClient); + provider.setAccessTokenResponseClient(client); return provider; } From 6c215302c37d88d179803e189b3f3ae9f89e2d90 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 14 Oct 2022 14:34:52 +0800 Subject: [PATCH 5/6] Fix error reported by "maven-checkstyle-plugin" by adding white space. --- .../oauth2/AadOAuth2ClientConfigurationTests.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java index 8b8c26ef62df..a4473c33be9e 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/aad/implementation/oauth2/AadOAuth2ClientConfigurationTests.java @@ -269,8 +269,8 @@ private static void assertRestTemplateWellConfiguredForAllOAuth2AuthorizedClient List providers = getAllOAuth2AuthorizedClientProviderThatShouldConfiguredRestTemplate(context); assertEquals(4, providers.size()); providers.forEach(provider -> { - OAuth2AccessTokenResponseClient client = (OAuth2AccessTokenResponseClient)getField(provider.getClass(), "accessTokenResponseClient", provider); - RestTemplate restTemplate = (RestTemplate)getField(client.getClass(), "restOperations", client); + OAuth2AccessTokenResponseClient client = (OAuth2AccessTokenResponseClient) getField(provider.getClass(), "accessTokenResponseClient", provider); + RestTemplate restTemplate = (RestTemplate) getField(client.getClass(), "restOperations", client); assertEquals(FACTORY, restTemplate.getRequestFactory()); }); } @@ -279,9 +279,9 @@ private static void assertRestTemplateWellConfiguredForAllOAuth2AuthorizedClient private static List getAllOAuth2AuthorizedClientProviderThatShouldConfiguredRestTemplate(ApplicationContext context) { final DefaultOAuth2AuthorizedClientManager manager = context.getBean(DefaultOAuth2AuthorizedClientManager.class); DelegatingOAuth2AuthorizedClientProvider delegatingProvider = - (DelegatingOAuth2AuthorizedClientProvider)getField(DefaultOAuth2AuthorizedClientManager.class, "authorizedClientProvider", manager); + (DelegatingOAuth2AuthorizedClientProvider) getField(DefaultOAuth2AuthorizedClientManager.class, "authorizedClientProvider", manager); List providers = - (List)getField(DelegatingOAuth2AuthorizedClientProvider.class, "authorizedClientProviders", delegatingProvider); + (List) getField(DelegatingOAuth2AuthorizedClientProvider.class, "authorizedClientProviders", delegatingProvider); return providers.stream() .filter(provider -> !(provider instanceof AuthorizationCodeOAuth2AuthorizedClientProvider)) .filter(provider -> !(provider instanceof AadAzureDelegatedOAuth2AuthorizedClientProvider)) From 5b084708496b97f9bf2d2d5474174ebd54e65f63 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 14 Oct 2022 15:19:12 +0800 Subject: [PATCH 6/6] Add a new item in CHANGELOG.md. --- sdk/spring/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index 5a45222c216c..d9fb11dd674d 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -5,6 +5,7 @@ Upgrade Spring Boot dependencies version to 2.7.4 and Spring Cloud dependencies #### Bugs Fixed - Fix bug: Put a value into Collections.emptyMap(). [#31190](https://github.com/Azure/azure-sdk-for-java/issues/31190). +- Fix bug: RestOperations is not well configured when jwkResolver is null. [#31218](https://github.com/Azure/azure-sdk-for-java/issues/31218). ## 4.4.0 (2022-09-26) Upgrade Spring Boot dependencies version to 2.7.3 and Spring Cloud dependencies version to 2021.0.3