Skip to content

Commit adf9769

Browse files
committed
Add ClientRegistration.withClientRegistration
Fixes gh-7486
1 parent 5f90523 commit adf9769

File tree

2 files changed

+119
-12
lines changed

2 files changed

+119
-12
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/ClientRegistration.java

+43-7
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,26 @@
1515
*/
1616
package org.springframework.security.oauth2.client.registration;
1717

18-
import org.springframework.security.core.SpringSecurityCoreVersion;
19-
import org.springframework.security.oauth2.core.AuthenticationMethod;
20-
import org.springframework.security.oauth2.core.AuthorizationGrantType;
21-
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
22-
import org.springframework.util.Assert;
23-
import org.springframework.util.StringUtils;
24-
2518
import java.io.Serializable;
2619
import java.util.Arrays;
2720
import java.util.Collection;
2821
import java.util.Collections;
22+
import java.util.HashMap;
23+
import java.util.HashSet;
2924
import java.util.LinkedHashMap;
3025
import java.util.LinkedHashSet;
3126
import java.util.Map;
3227
import java.util.Set;
3328

29+
import org.springframework.security.core.SpringSecurityCoreVersion;
30+
import org.springframework.security.oauth2.core.AuthenticationMethod;
31+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
32+
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
33+
import org.springframework.util.Assert;
34+
import org.springframework.util.StringUtils;
35+
36+
import static java.util.Collections.EMPTY_MAP;
37+
3438
/**
3539
* A representation of a client registration with an OAuth 2.0 or OpenID Connect 1.0 Provider.
3640
*
@@ -263,6 +267,17 @@ public static Builder withRegistrationId(String registrationId) {
263267
return new Builder(registrationId);
264268
}
265269

270+
/**
271+
* Returns a new {@link Builder}, initialized with the provided {@link ClientRegistration}.
272+
*
273+
* @param clientRegistration the {@link ClientRegistration} to copy from
274+
* @return the {@link Builder}
275+
*/
276+
public static Builder withClientRegistration(ClientRegistration clientRegistration) {
277+
Assert.notNull(clientRegistration, "clientRegistration cannot be null");
278+
return new Builder(clientRegistration);
279+
}
280+
266281
/**
267282
* A builder for {@link ClientRegistration}.
268283
*/
@@ -288,6 +303,27 @@ private Builder(String registrationId) {
288303
this.registrationId = registrationId;
289304
}
290305

306+
private Builder(ClientRegistration clientRegistration) {
307+
this.registrationId = clientRegistration.registrationId;
308+
this.clientId = clientRegistration.clientId;
309+
this.clientSecret = clientRegistration.clientSecret;
310+
this.clientAuthenticationMethod = clientRegistration.clientAuthenticationMethod;
311+
this.authorizationGrantType = clientRegistration.authorizationGrantType;
312+
this.redirectUriTemplate = clientRegistration.redirectUriTemplate;
313+
this.scopes = clientRegistration.scopes == null ? null : new HashSet<>(clientRegistration.scopes);
314+
this.authorizationUri = clientRegistration.providerDetails.authorizationUri;
315+
this.tokenUri = clientRegistration.providerDetails.tokenUri;
316+
this.userInfoUri = clientRegistration.providerDetails.userInfoEndpoint.uri;
317+
this.userInfoAuthenticationMethod = clientRegistration.providerDetails.userInfoEndpoint.authenticationMethod;
318+
this.userNameAttributeName = clientRegistration.providerDetails.userInfoEndpoint.userNameAttributeName;
319+
this.jwkSetUri = clientRegistration.providerDetails.jwkSetUri;
320+
Map<String, Object> configurationMetadata = clientRegistration.providerDetails.configurationMetadata;
321+
if (configurationMetadata != EMPTY_MAP) {
322+
this.configurationMetadata = new HashMap<>(configurationMetadata);
323+
}
324+
this.clientName = clientRegistration.clientName;
325+
}
326+
291327
/**
292328
* Sets the registration id.
293329
*

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/ClientRegistrationTests.java

+76-5
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,23 @@
1515
*/
1616
package org.springframework.security.oauth2.client.registration;
1717

18-
import org.junit.Test;
19-
import org.springframework.security.oauth2.core.AuthenticationMethod;
20-
import org.springframework.security.oauth2.core.AuthorizationGrantType;
21-
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
22-
2318
import java.util.Collections;
2419
import java.util.LinkedHashMap;
2520
import java.util.Map;
2621
import java.util.Set;
2722
import java.util.stream.Collectors;
2823
import java.util.stream.Stream;
2924

25+
import org.junit.Test;
26+
27+
import org.springframework.security.oauth2.core.AuthenticationMethod;
28+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
29+
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
30+
3031
import static org.assertj.core.api.Assertions.assertThat;
3132
import static org.assertj.core.api.Assertions.assertThatThrownBy;
33+
import static org.springframework.security.oauth2.client.registration.ClientRegistration.withClientRegistration;
34+
import static org.springframework.security.oauth2.client.registration.TestClientRegistrations.clientRegistration;
3235

3336
/**
3437
* Tests for {@link ClientRegistration}.
@@ -696,4 +699,72 @@ public void buildWhenCustomGrantAllAttributesProvidedThenAllAttributesAreSet() {
696699
assertThat(registration.getProviderDetails().getTokenUri()).isEqualTo(TOKEN_URI);
697700
assertThat(registration.getClientName()).isEqualTo(CLIENT_NAME);
698701
}
702+
703+
@Test
704+
public void buildWhenClientRegistrationProvidedThenMakesACopy() {
705+
ClientRegistration clientRegistration = clientRegistration().build();
706+
ClientRegistration updated = withClientRegistration(clientRegistration).build();
707+
assertThat(clientRegistration.getScopes()).isEqualTo(updated.getScopes());
708+
assertThat(clientRegistration.getScopes()).isNotSameAs(updated.getScopes());
709+
assertThat(clientRegistration.getProviderDetails().getConfigurationMetadata())
710+
.isEqualTo(updated.getProviderDetails().getConfigurationMetadata());
711+
assertThat(clientRegistration.getProviderDetails().getConfigurationMetadata())
712+
.isNotSameAs(updated.getProviderDetails().getConfigurationMetadata());
713+
}
714+
715+
@Test
716+
public void buildWhenClientRegistrationProvidedThenEachPropertyMatches() {
717+
ClientRegistration clientRegistration = clientRegistration().build();
718+
ClientRegistration updated = withClientRegistration(clientRegistration).build();
719+
assertThat(clientRegistration.getRegistrationId()).isEqualTo(updated.getRegistrationId());
720+
assertThat(clientRegistration.getClientId()).isEqualTo(updated.getClientId());
721+
assertThat(clientRegistration.getClientSecret()).isEqualTo(updated.getClientSecret());
722+
assertThat(clientRegistration.getClientAuthenticationMethod())
723+
.isEqualTo(updated.getClientAuthenticationMethod());
724+
assertThat(clientRegistration.getAuthorizationGrantType())
725+
.isEqualTo(updated.getAuthorizationGrantType());
726+
assertThat(clientRegistration.getRedirectUriTemplate())
727+
.isEqualTo(updated.getRedirectUriTemplate());
728+
assertThat(clientRegistration.getScopes()).isEqualTo(updated.getScopes());
729+
730+
ClientRegistration.ProviderDetails providerDetails = clientRegistration.getProviderDetails();
731+
ClientRegistration.ProviderDetails updatedProviderDetails = updated.getProviderDetails();
732+
assertThat(providerDetails.getAuthorizationUri())
733+
.isEqualTo(updatedProviderDetails.getAuthorizationUri());
734+
assertThat(providerDetails.getTokenUri())
735+
.isEqualTo(updatedProviderDetails.getTokenUri());
736+
737+
ClientRegistration.ProviderDetails.UserInfoEndpoint userInfoEndpoint = providerDetails.getUserInfoEndpoint();
738+
ClientRegistration.ProviderDetails.UserInfoEndpoint updatedUserInfoEndpoint = updatedProviderDetails.getUserInfoEndpoint();
739+
assertThat(userInfoEndpoint.getUri()).isEqualTo(updatedUserInfoEndpoint.getUri());
740+
assertThat(userInfoEndpoint.getAuthenticationMethod())
741+
.isEqualTo(updatedUserInfoEndpoint.getAuthenticationMethod());
742+
assertThat(userInfoEndpoint.getUserNameAttributeName())
743+
.isEqualTo(updatedUserInfoEndpoint.getUserNameAttributeName());
744+
745+
assertThat(providerDetails.getJwkSetUri()).isEqualTo(updatedProviderDetails.getJwkSetUri());
746+
assertThat(providerDetails.getConfigurationMetadata())
747+
.isEqualTo(updatedProviderDetails.getConfigurationMetadata());
748+
749+
assertThat(clientRegistration.getClientName()).isEqualTo(updated.getClientName());
750+
}
751+
752+
@Test
753+
public void buildWhenClientRegistrationValuesOverriddenThenPropagated() {
754+
ClientRegistration clientRegistration = clientRegistration().build();
755+
ClientRegistration updated = withClientRegistration(clientRegistration)
756+
.clientSecret("a-new-secret")
757+
.scope("a-new-scope")
758+
.providerConfigurationMetadata(Collections.singletonMap("a-new-config", "a-new-value"))
759+
.build();
760+
761+
assertThat(clientRegistration.getClientSecret()).isNotEqualTo(updated.getClientSecret());
762+
assertThat(updated.getClientSecret()).isEqualTo("a-new-secret");
763+
assertThat(clientRegistration.getScopes()).doesNotContain("a-new-scope");
764+
assertThat(updated.getScopes()).containsExactly("a-new-scope");
765+
assertThat(clientRegistration.getProviderDetails().getConfigurationMetadata())
766+
.doesNotContainKey("a-new-config").doesNotContainValue("a-new-value");
767+
assertThat(updated.getProviderDetails().getConfigurationMetadata())
768+
.containsOnlyKeys("a-new-config").containsValue("a-new-value");
769+
}
699770
}

0 commit comments

Comments
 (0)