Skip to content

Commit 5e98b92

Browse files
committed
In-memory ClientRegistration Repo Duplicate Check
Fixes gh-7338
1 parent f6c650d commit 5e98b92

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

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

+19-13
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,17 @@
1515
*/
1616
package org.springframework.security.oauth2.client.registration;
1717

18+
import java.util.Arrays;
19+
import java.util.Collections;
1820
import java.util.Iterator;
1921
import java.util.List;
2022
import java.util.Map;
2123
import java.util.concurrent.ConcurrentHashMap;
22-
import java.util.concurrent.ConcurrentHashMap;
23-
24-
import org.springframework.util.Assert;
2524

2625
import reactor.core.publisher.Mono;
2726

27+
import org.springframework.util.Assert;
28+
2829
/**
2930
* A Reactive {@link ClientRegistrationRepository} that stores {@link ClientRegistration}(s) in-memory.
3031
*
@@ -45,12 +46,12 @@ public final class InMemoryReactiveClientRegistrationRepository
4546
* @param registrations the client registration(s)
4647
*/
4748
public InMemoryReactiveClientRegistrationRepository(ClientRegistration... registrations) {
48-
Assert.notEmpty(registrations, "registrations cannot be empty");
49-
this.clientIdToClientRegistration = new ConcurrentHashMap<>();
50-
for (ClientRegistration registration : registrations) {
51-
Assert.notNull(registration, "registrations cannot contain null values");
52-
this.clientIdToClientRegistration.put(registration.getRegistrationId(), registration);
53-
}
49+
this(toList(registrations));
50+
}
51+
52+
private static List<ClientRegistration> toList(ClientRegistration... registrations) {
53+
Assert.notEmpty(registrations, "registrations cannot be null or empty");
54+
return Arrays.asList(registrations);
5455
}
5556

5657
/**
@@ -59,8 +60,7 @@ public InMemoryReactiveClientRegistrationRepository(ClientRegistration... regist
5960
* @param registrations the client registration(s)
6061
*/
6162
public InMemoryReactiveClientRegistrationRepository(List<ClientRegistration> registrations) {
62-
Assert.notEmpty(registrations, "registrations cannot be null or empty");
63-
this.clientIdToClientRegistration = toConcurrentMap(registrations);
63+
this.clientIdToClientRegistration = toUnmodifiableConcurrentMap(registrations);
6464
}
6565

6666
@Override
@@ -78,11 +78,17 @@ public Iterator<ClientRegistration> iterator() {
7878
return this.clientIdToClientRegistration.values().iterator();
7979
}
8080

81-
private ConcurrentHashMap<String, ClientRegistration> toConcurrentMap(List<ClientRegistration> registrations) {
81+
private static Map<String, ClientRegistration> toUnmodifiableConcurrentMap(List<ClientRegistration> registrations) {
82+
Assert.notEmpty(registrations, "registrations cannot be null or empty");
8283
ConcurrentHashMap<String, ClientRegistration> result = new ConcurrentHashMap<>();
8384
for (ClientRegistration registration : registrations) {
85+
Assert.notNull(registration, "no registration can be null");
86+
if (result.containsKey(registration.getRegistrationId())) {
87+
throw new IllegalStateException(String.format("Duplicate key %s",
88+
registration.getRegistrationId()));
89+
}
8490
result.put(registration.getRegistrationId(), registration);
8591
}
86-
return result;
92+
return Collections.unmodifiableMap(result);
8793
}
8894
}

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

+10-4
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616

1717
package org.springframework.security.oauth2.client.registration;
1818

19-
import static org.assertj.core.api.Assertions.assertThat;
20-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
21-
19+
import java.util.Arrays;
2220
import java.util.List;
2321

2422
import org.junit.Before;
2523
import org.junit.Test;
26-
2724
import reactor.test.StepVerifier;
2825

26+
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
28+
2929
/**
3030
* @author Rob Winch
3131
* @since 5.1
@@ -61,6 +61,12 @@ public void constructorWhenClientRegistrationListThenIllegalArgumentException()
6161
.isInstanceOf(IllegalArgumentException.class);
6262
}
6363

64+
@Test(expected = IllegalStateException.class)
65+
public void constructorListClientRegistrationWhenDuplicateIdThenIllegalArgumentException() {
66+
List<ClientRegistration> registrations = Arrays.asList(this.registration, this.registration);
67+
new InMemoryReactiveClientRegistrationRepository(registrations);
68+
}
69+
6470
@Test
6571
public void constructorWhenClientRegistrationIsNullThenIllegalArgumentException() {
6672
ClientRegistration registration = null;

0 commit comments

Comments
 (0)