Skip to content

Commit d41e9d4

Browse files
authored
Manage all RestTemplate used for Azure AD related http requests (Azure#31048)
1 parent 336bf4e commit d41e9d4

File tree

62 files changed

+451
-606
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+451
-606
lines changed

eng/code-quality-reports/src/main/resources/revapi/revapi.json

Lines changed: 50 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -120,76 +120,6 @@
120120
"configuration": {
121121
"ignore": true,
122122
"differences": [
123-
{
124-
"code": "java.method.numberOfParametersChanged",
125-
"new": "method void com.azure.spring.cloud.autoconfigure.aad.AadAuthenticationFilterAutoConfiguration::<init>(com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties, org.springframework.web.client.RestOperations)",
126-
"justification": "The change is expected. This will not be used by customer's java code directly."
127-
},
128-
{
129-
"code": "java.method.numberOfParametersChanged",
130-
"new": "method void com.azure.spring.cloud.autoconfigure.aad.configuration.AadOAuth2ClientConfiguration::<init>(org.springframework.web.client.RestOperations)",
131-
"justification": "The change is expected. This will not be used by customer's java code directly."
132-
},
133-
{
134-
"code": "java.method.numberOfParametersChanged",
135-
"new": "method void com.azure.spring.cloud.autoconfigure.aad.configuration.AadResourceServerConfiguration::<init>(org.springframework.web.client.RestOperations)",
136-
"justification": "The change is expected. This will not be used by customer's java code directly."
137-
},
138-
{
139-
"code": "java.method.numberOfParametersChanged",
140-
"new": "method void com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cResourceServerAutoConfiguration::<init>(com.azure.spring.cloud.autoconfigure.aadb2c.properties.AadB2cProperties, org.springframework.web.client.RestOperations)",
141-
"justification": "The change is expected. This will not be used by customer's java code directly."
142-
},
143-
{
144-
"code": "java.method.numberOfParametersChanged",
145-
"new": "method com.nimbusds.jwt.proc.JWTClaimsSetAwareJWSKeySelector<com.nimbusds.jose.proc.SecurityContext> com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cResourceServerAutoConfiguration::aadIssuerJwsKeySelector(com.azure.spring.cloud.autoconfigure.aad.AadTrustedIssuerRepository, com.nimbusds.jose.util.ResourceRetriever)",
146-
"justification": "The change is expected. This will not be used by customer's java code directly."
147-
},
148-
{
149-
"code": "java.method.numberOfParametersChanged",
150-
"new": "method void com.azure.spring.cloud.autoconfigure.aadb2c.configuration.AadB2cOAuth2ClientConfiguration::<init>(com.azure.spring.cloud.autoconfigure.aadb2c.properties.AadB2cProperties, org.springframework.web.client.RestOperations)",
151-
"justification": "The change is expected. This will not be used by customer's java code directly."
152-
},
153-
{
154-
"code": "java.annotation.attributeValueChanged",
155-
"new": "class com.azure.spring.cloud.autoconfigure.aad.AadAuthenticationFilterAutoConfiguration",
156-
"justification": "The change is expected. This is bean definition class, will not be used by customer's java code directly."
157-
},
158-
{
159-
"code": "java.method.numberOfParametersChanged",
160-
"new": "method org.springframework.security.oauth2.jwt.JwtDecoder com.azure.spring.cloud.autoconfigure.aad.configuration.AadResourceServerConfiguration::jwtDecoder(com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties, org.springframework.web.client.RestOperations)",
161-
"justification": "The change is expected. This is bean definition method, will not be used by customer's java code directly."
162-
},
163-
{
164-
"code": "java.annotation.added",
165-
"new": "class com.azure.spring.cloud.autoconfigure.aad.configuration.AadResourceServerConfiguration",
166-
"justification": "The change is expected. This is bean definition class, will not be used by customer's java code directly."
167-
},
168-
{
169-
"code": "java.annotation.attributeValueChanged",
170-
"new": "class com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cResourceServerAutoConfiguration",
171-
"justification": "The change is expected. This is bean definition class, will not be used by customer's java code directly."
172-
},
173-
{
174-
"code": "java.method.numberOfParametersChanged",
175-
"new": "method org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager com.azure.spring.cloud.autoconfigure.aadb2c.configuration.AadB2cOAuth2ClientConfiguration::authorizedClientManager(org.springframework.web.client.RestOperations, org.springframework.security.oauth2.client.registration.ClientRegistrationRepository, org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository)",
176-
"justification": "The change is expected. This is bean definition method, will not be used by customer's java code directly."
177-
},
178-
{
179-
"code": "java.annotation.attributeValueChanged",
180-
"new": "class com.azure.spring.cloud.autoconfigure.aadb2c.configuration.AadB2cOAuth2ClientConfiguration",
181-
"justification": "The change is expected. This is bean definition class, will not be used by customer's java code directly."
182-
},
183-
{
184-
"code": "java.method.numberOfParametersChanged",
185-
"new": "method com.nimbusds.jose.util.ResourceRetriever com.azure.spring.cloud.autoconfigure.aad.AadAuthenticationFilterAutoConfiguration::jwtResourceRetriever(org.springframework.web.client.RestOperations)",
186-
"justification": "The change is expected. This is bean definition method, will not be used by customer's java code directly."
187-
},
188-
{
189-
"code": "java.method.numberOfParametersChanged",
190-
"new": "method com.nimbusds.jwt.proc.JWTClaimsSetAwareJWSKeySelector<com.nimbusds.jose.proc.SecurityContext> com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cResourceServerAutoConfiguration::aadIssuerJwsKeySelector(org.springframework.web.client.RestOperations, com.azure.spring.cloud.autoconfigure.aad.AadTrustedIssuerRepository, com.nimbusds.jose.util.ResourceRetriever)",
191-
"justification": "The change is expected. This is bean definition method, will not be used by customer's java code directly."
192-
},
193123
{
194124
"regex": true,
195125
"code": "java.class.nonPublicPartOfAPI",
@@ -521,6 +451,56 @@
521451
"code": "java.field.removedWithConstant",
522452
"old": "field com.azure.spring.cloud.config.properties.AppConfigurationStoreSelects.LABEL_SEPARATOR",
523453
"justification": "Not a public api"
454+
},
455+
{
456+
"code": "java.method.numberOfParametersChanged",
457+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.AadAuthenticationFilterAutoConfiguration::<init>(com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties, org.springframework.boot.web.client.RestTemplateBuilder)",
458+
"justification": "Bean configuration will not be used by customer in java code."
459+
},
460+
{
461+
"code": "java.method.numberOfParametersChanged",
462+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.configuration.AadOAuth2ClientConfiguration::<init>(org.springframework.boot.web.client.RestTemplateBuilder)",
463+
"justification": "Bean configuration will not be used by customer in java code."
464+
},
465+
{
466+
"code": "java.method.numberOfParametersChanged",
467+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.configuration.AadResourceServerConfiguration::<init>(org.springframework.boot.web.client.RestTemplateBuilder)",
468+
"justification": "Bean configuration will not be used by customer in java code."
469+
},
470+
{
471+
"code": "java.method.numberOfParametersChanged",
472+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.configuration.AadWebApplicationConfiguration::<init>(org.springframework.boot.web.client.RestTemplateBuilder)",
473+
"justification": "Bean configuration will not be used by customer in java code."
474+
},
475+
{
476+
"code": "java.method.numberOfParametersChanged",
477+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.filter.AadAuthenticationFilter::<init>(com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties, com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationServerEndpoints, com.azure.spring.cloud.autoconfigure.aad.filter.UserPrincipalManager, org.springframework.boot.web.client.RestTemplateBuilder)",
478+
"justification": "Customer's java code will not call this method directly."
479+
},
480+
{
481+
"code": "java.method.numberOfParametersChanged",
482+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.filter.AadAuthenticationFilter::<init>(com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties, com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationServerEndpoints, com.nimbusds.jose.util.ResourceRetriever, org.springframework.boot.web.client.RestTemplateBuilder)",
483+
"justification": "Customer's java code will not call this method directly."
484+
},
485+
{
486+
"code": "java.method.numberOfParametersChanged",
487+
"new": "method void com.azure.spring.cloud.autoconfigure.aad.filter.AadAuthenticationFilter::<init>(com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties, com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationServerEndpoints, com.nimbusds.jose.util.ResourceRetriever, com.nimbusds.jose.jwk.source.JWKSetCache, org.springframework.boot.web.client.RestTemplateBuilder)",
488+
"justification": "Customer's java code will not call this method directly."
489+
},
490+
{
491+
"code": "java.method.numberOfParametersChanged",
492+
"new": "method void com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cResourceServerAutoConfiguration::<init>(com.azure.spring.cloud.autoconfigure.aadb2c.properties.AadB2cProperties, org.springframework.boot.web.client.RestTemplateBuilder)",
493+
"justification": "Bean configuration will not be used by customer in java code."
494+
},
495+
{
496+
"code": "java.method.numberOfParametersChanged",
497+
"new": "method com.nimbusds.jwt.proc.JWTClaimsSetAwareJWSKeySelector<com.nimbusds.jose.proc.SecurityContext> com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cResourceServerAutoConfiguration::aadIssuerJwsKeySelector(com.azure.spring.cloud.autoconfigure.aad.AadTrustedIssuerRepository, com.nimbusds.jose.util.ResourceRetriever)",
498+
"justification": "Bean configuration will not be used by customer in java code."
499+
},
500+
{
501+
"code": "java.method.numberOfParametersChanged",
502+
"new": "method void com.azure.spring.cloud.autoconfigure.aadb2c.configuration.AadB2cOAuth2ClientConfiguration::<init>(com.azure.spring.cloud.autoconfigure.aadb2c.properties.AadB2cProperties, org.springframework.boot.web.client.RestTemplateBuilder)",
503+
"justification": "Bean configuration will not be used by customer in java code."
524504
}
525505
]
526506
}

sdk/spring/spring-cloud-azure-autoconfigure/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,6 @@
291291
<version>2.7.3</version> <!-- {x-version-update;org.springframework.boot:spring-boot-configuration-metadata;external_dependency} -->
292292
<scope>test</scope>
293293
</dependency>
294-
<dependency>
295-
<groupId>com.github.tomakehurst</groupId>
296-
<artifactId>wiremock-jre8</artifactId>
297-
<version>2.33.2</version> <!-- {x-version-update;com.github.tomakehurst:wiremock-jre8;external_dependency} -->
298-
<scope>test</scope>
299-
</dependency>
300294
<dependency>
301295
<groupId>org.glassfish</groupId>
302296
<artifactId>jakarta.el</artifactId>

sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/AadAuthenticationFilterAutoConfiguration.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.azure.spring.cloud.autoconfigure.aad.filter.AadAppRoleStatelessAuthenticationFilter;
88
import com.azure.spring.cloud.autoconfigure.aad.filter.AadAuthenticationFilter;
99
import com.azure.spring.cloud.autoconfigure.aad.filter.UserPrincipalManager;
10-
import com.azure.spring.cloud.autoconfigure.aad.implementation.AadOauth2ResourceServerRestOperationConfiguration;
1110
import com.azure.spring.cloud.autoconfigure.aad.implementation.jwt.RestOperationsResourceRetriever;
1211
import com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties;
1312
import com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationServerEndpoints;
@@ -16,21 +15,18 @@
1615
import com.nimbusds.jose.util.ResourceRetriever;
1716
import org.slf4j.Logger;
1817
import org.slf4j.LoggerFactory;
19-
import org.springframework.beans.factory.annotation.Qualifier;
2018
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2119
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
2220
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2321
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
2422
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
23+
import org.springframework.boot.web.client.RestTemplateBuilder;
2524
import org.springframework.context.annotation.Bean;
2625
import org.springframework.context.annotation.Configuration;
2726
import org.springframework.context.annotation.Import;
28-
import org.springframework.web.client.RestOperations;
2927

3028
import java.util.concurrent.TimeUnit;
3129

32-
import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadOauth2ResourceServerRestOperationConfiguration.AAD_OAUTH_2_RESOURCE_SERVER_REST_OPERATION_BEAN_NAME;
33-
3430
/**
3531
* {@link EnableAutoConfiguration Auto-configuration} for Azure Active Authentication filters.
3632
* <p>
@@ -43,28 +39,29 @@
4339
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
4440
@ConditionalOnExpression("${spring.cloud.azure.active-directory.enabled:false}")
4541
@ConditionalOnMissingClass({ "org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken" })
46-
@Import({AadPropertiesConfiguration.class, AadOauth2ResourceServerRestOperationConfiguration.class})
42+
@Import(AadPropertiesConfiguration.class)
4743
public class AadAuthenticationFilterAutoConfiguration {
4844

4945
private static final Logger LOGGER = LoggerFactory.getLogger(AadAuthenticationProperties.class);
5046

5147
private final AadAuthenticationProperties properties;
5248
private final AadAuthorizationServerEndpoints endpoints;
53-
private final RestOperations restOperations;
49+
private final RestTemplateBuilder restTemplateBuilder;
5450

5551
/**
5652
* Creates a new instance of {@link AadAuthenticationFilterAutoConfiguration}.
5753
*
5854
* @param properties the AAD authentication properties
59-
* @param restOperations the restOperations
55+
* @param restTemplateBuilder the RestTemplateBuilder
6056
*/
6157
public AadAuthenticationFilterAutoConfiguration(
6258
AadAuthenticationProperties properties,
63-
@Qualifier(AAD_OAUTH_2_RESOURCE_SERVER_REST_OPERATION_BEAN_NAME) RestOperations restOperations) {
59+
RestTemplateBuilder restTemplateBuilder) {
6460
this.properties = properties;
65-
this.restOperations = restOperations;
66-
this.endpoints = new AadAuthorizationServerEndpoints(properties.getProfile().getEnvironment().getActiveDirectoryEndpoint(),
67-
properties.getProfile().getTenantId());
61+
this.restTemplateBuilder = restTemplateBuilder;
62+
this.endpoints = new AadAuthorizationServerEndpoints(
63+
properties.getProfile().getEnvironment().getActiveDirectoryEndpoint(),
64+
properties.getProfile().getTenantId());
6865
}
6966

7067
/**
@@ -77,13 +74,16 @@ public AadAuthenticationFilterAutoConfiguration(
7774
@Bean
7875
@ConditionalOnMissingBean(AadAuthenticationFilter.class)
7976
@ConditionalOnExpression("${spring.cloud.azure.active-directory.session-stateless:false} == false")
80-
public AadAuthenticationFilter aadAuthenticationFilter(ResourceRetriever resourceRetriever, JWKSetCache jwkSetCache) {
77+
public AadAuthenticationFilter aadAuthenticationFilter(
78+
ResourceRetriever resourceRetriever,
79+
JWKSetCache jwkSetCache) {
8180
LOGGER.info("AadAuthenticationFilter Constructor.");
8281
return new AadAuthenticationFilter(
8382
properties,
8483
endpoints,
8584
resourceRetriever,
86-
jwkSetCache
85+
jwkSetCache,
86+
restTemplateBuilder
8787
);
8888
}
8989

@@ -116,7 +116,7 @@ public AadAppRoleStatelessAuthenticationFilter aadStatelessAuthFilter(ResourceRe
116116
@Bean
117117
@ConditionalOnMissingBean(ResourceRetriever.class)
118118
public ResourceRetriever jwtResourceRetriever() {
119-
return new RestOperationsResourceRetriever(restOperations);
119+
return new RestOperationsResourceRetriever(restTemplateBuilder);
120120
}
121121

122122
/**

sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/aad/AadWebSecurityConfigurerAdapter.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties;
1010
import org.springframework.beans.factory.ObjectProvider;
1111
import org.springframework.beans.factory.annotation.Autowired;
12-
import org.springframework.beans.factory.annotation.Qualifier;
12+
import org.springframework.boot.web.client.RestTemplateBuilder;
1313
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1414
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
1515
import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
@@ -24,11 +24,10 @@
2424
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
2525
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
2626
import org.springframework.util.StringUtils;
27-
import org.springframework.web.client.RestOperations;
2827

2928
import javax.servlet.Filter;
3029

31-
import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadOauth2ClientRestOperationConfiguration.AAD_OAUTH_2_CLIENT_REST_OPERATION_BEAN_NAME;
30+
import static com.azure.spring.cloud.autoconfigure.aad.implementation.AadRestTemplateCreator.createOAuth2AccessTokenResponseClientRestTemplate;
3231

3332
/**
3433
* Abstract configuration class, used to make AzureClientRegistrationRepository and AuthzCodeGrantRequestEntityConverter
@@ -46,11 +45,10 @@ public abstract class AadWebSecurityConfigurerAdapter extends WebSecurityConfigu
4645

4746

4847
/**
49-
* RestOperations bean used to get access token from Azure AD.
48+
* restTemplateBuilder bean used to create RestTemplate for Azure AD related http request.
5049
*/
5150
@Autowired
52-
@Qualifier(AAD_OAUTH_2_CLIENT_REST_OPERATION_BEAN_NAME)
53-
protected RestOperations restOperations;
51+
protected RestTemplateBuilder restTemplateBuilder;
5452

5553
/**
5654
* OIDC user service.
@@ -134,7 +132,7 @@ protected LogoutSuccessHandler oidcLogoutSuccessHandler() {
134132
*/
135133
protected OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient() {
136134
DefaultAuthorizationCodeTokenResponseClient result = new DefaultAuthorizationCodeTokenResponseClient();
137-
result.setRestOperations(restOperations);
135+
result.setRestOperations(createOAuth2AccessTokenResponseClientRestTemplate(restTemplateBuilder));
138136
if (repo instanceof AadClientRegistrationRepository) {
139137
AadOAuth2AuthorizationCodeGrantRequestEntityConverter converter =
140138
new AadOAuth2AuthorizationCodeGrantRequestEntityConverter(

0 commit comments

Comments
 (0)