Skip to content

Commit 979ac7c

Browse files
iigolovkojgrandja
authored andcommitted
Remove cache from (Reactive)OidcIdTokenDecoderFactory
Closes gh-16647 Signed-off-by: iigolovko <[email protected]>
1 parent 2af57c4 commit 979ac7c

File tree

4 files changed

+38
-26
lines changed

4 files changed

+38
-26
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/oidc/authentication/OidcIdTokenDecoderFactory.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.Collections;
2424
import java.util.HashMap;
2525
import java.util.Map;
26-
import java.util.concurrent.ConcurrentHashMap;
2726
import java.util.function.Function;
2827

2928
import javax.crypto.spec.SecretKeySpec;
@@ -78,8 +77,6 @@ public final class OidcIdTokenDecoderFactory implements JwtDecoderFactory<Client
7877

7978
private static final ClaimTypeConverter DEFAULT_CLAIM_TYPE_CONVERTER = createDefaultClaimTypeConverter();
8079

81-
private final Map<String, JwtDecoder> jwtDecoders = new ConcurrentHashMap<>();
82-
8380
private Function<ClientRegistration, OAuth2TokenValidator<Jwt>> jwtValidatorFactory = new DefaultOidcIdTokenValidatorFactory();
8481

8582
private Function<ClientRegistration, JwsAlgorithm> jwsAlgorithmResolver = (
@@ -135,16 +132,14 @@ public static ClaimTypeConverter createDefaultClaimTypeConverter() {
135132
@Override
136133
public JwtDecoder createDecoder(ClientRegistration clientRegistration) {
137134
Assert.notNull(clientRegistration, "clientRegistration cannot be null");
138-
return this.jwtDecoders.computeIfAbsent(clientRegistration.getRegistrationId(), (key) -> {
139-
NimbusJwtDecoder jwtDecoder = buildDecoder(clientRegistration);
140-
jwtDecoder.setJwtValidator(this.jwtValidatorFactory.apply(clientRegistration));
141-
Converter<Map<String, Object>, Map<String, Object>> claimTypeConverter = this.claimTypeConverterFactory
142-
.apply(clientRegistration);
143-
if (claimTypeConverter != null) {
144-
jwtDecoder.setClaimSetConverter(claimTypeConverter);
145-
}
146-
return jwtDecoder;
147-
});
135+
NimbusJwtDecoder jwtDecoder = buildDecoder(clientRegistration);
136+
jwtDecoder.setJwtValidator(this.jwtValidatorFactory.apply(clientRegistration));
137+
Converter<Map<String, Object>, Map<String, Object>> claimTypeConverter = this.claimTypeConverterFactory
138+
.apply(clientRegistration);
139+
if (claimTypeConverter != null) {
140+
jwtDecoder.setClaimSetConverter(claimTypeConverter);
141+
}
142+
return jwtDecoder;
148143
}
149144

150145
private NimbusJwtDecoder buildDecoder(ClientRegistration clientRegistration) {

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/oidc/authentication/ReactiveOidcIdTokenDecoderFactory.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.Collections;
2424
import java.util.HashMap;
2525
import java.util.Map;
26-
import java.util.concurrent.ConcurrentHashMap;
2726
import java.util.function.Function;
2827

2928
import javax.crypto.spec.SecretKeySpec;
@@ -80,8 +79,6 @@ public final class ReactiveOidcIdTokenDecoderFactory implements ReactiveJwtDecod
8079
private static final ClaimTypeConverter DEFAULT_CLAIM_TYPE_CONVERTER = new ClaimTypeConverter(
8180
createDefaultClaimTypeConverters());
8281

83-
private final Map<String, ReactiveJwtDecoder> jwtDecoders = new ConcurrentHashMap<>();
84-
8582
private Function<ClientRegistration, OAuth2TokenValidator<Jwt>> jwtValidatorFactory = new DefaultOidcIdTokenValidatorFactory();
8683

8784
private Function<ClientRegistration, JwsAlgorithm> jwsAlgorithmResolver = (
@@ -126,16 +123,14 @@ public final class ReactiveOidcIdTokenDecoderFactory implements ReactiveJwtDecod
126123
@Override
127124
public ReactiveJwtDecoder createDecoder(ClientRegistration clientRegistration) {
128125
Assert.notNull(clientRegistration, "clientRegistration cannot be null");
129-
return this.jwtDecoders.computeIfAbsent(clientRegistration.getRegistrationId(), (key) -> {
130-
NimbusReactiveJwtDecoder jwtDecoder = buildDecoder(clientRegistration);
131-
jwtDecoder.setJwtValidator(this.jwtValidatorFactory.apply(clientRegistration));
132-
Converter<Map<String, Object>, Map<String, Object>> claimTypeConverter = this.claimTypeConverterFactory
133-
.apply(clientRegistration);
134-
if (claimTypeConverter != null) {
135-
jwtDecoder.setClaimSetConverter(claimTypeConverter);
136-
}
137-
return jwtDecoder;
138-
});
126+
NimbusReactiveJwtDecoder jwtDecoder = buildDecoder(clientRegistration);
127+
jwtDecoder.setJwtValidator(this.jwtValidatorFactory.apply(clientRegistration));
128+
Converter<Map<String, Object>, Map<String, Object>> claimTypeConverter = this.claimTypeConverterFactory
129+
.apply(clientRegistration);
130+
if (claimTypeConverter != null) {
131+
jwtDecoder.setClaimSetConverter(claimTypeConverter);
132+
}
133+
return jwtDecoder;
139134
}
140135

141136
private NimbusReactiveJwtDecoder buildDecoder(ClientRegistration clientRegistration) {

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/oidc/authentication/OidcIdTokenDecoderFactoryTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.security.oauth2.jose.jws.MacAlgorithm;
3535
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
3636
import org.springframework.security.oauth2.jwt.Jwt;
37+
import org.springframework.security.oauth2.jwt.JwtDecoder;
3738

3839
import static org.assertj.core.api.Assertions.assertThat;
3940
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -46,6 +47,7 @@
4647
/**
4748
* @author Joe Grandja
4849
* @author Rafael Dominguez
50+
* @author Ivan Golovko
4951
* @since 5.2
5052
*/
5153
public class OidcIdTokenDecoderFactoryTests {
@@ -177,4 +179,13 @@ public void createDecoderWhenCustomClaimTypeConverterFactorySetThenApplied() {
177179
verify(customClaimTypeConverterFactory).apply(same(clientRegistration));
178180
}
179181

182+
// gh-16647
183+
@Test
184+
public void createDecoderWhenCachingRemovedThenReturnNewDecoder() {
185+
ClientRegistration clientRegistration = this.registration.build();
186+
JwtDecoder decoder1 = this.idTokenDecoderFactory.createDecoder(clientRegistration);
187+
JwtDecoder decoder2 = this.idTokenDecoderFactory.createDecoder(clientRegistration);
188+
assertThat(decoder1).isNotSameAs(decoder2);
189+
}
190+
180191
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/oidc/authentication/ReactiveOidcIdTokenDecoderFactoryTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.security.oauth2.jose.jws.MacAlgorithm;
3535
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
3636
import org.springframework.security.oauth2.jwt.Jwt;
37+
import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder;
3738

3839
import static org.assertj.core.api.Assertions.assertThat;
3940
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -47,6 +48,7 @@
4748
* @author Joe Grandja
4849
* @author Rafael Dominguez
4950
* @author Ubaid ur Rehman
51+
* @author Ivan Golovko
5052
* @since 5.2
5153
*/
5254
public class ReactiveOidcIdTokenDecoderFactoryTests {
@@ -177,4 +179,13 @@ public void createDecoderWhenCustomClaimTypeConverterFactorySetThenApplied() {
177179
verify(customClaimTypeConverterFactory).apply(same(clientRegistration));
178180
}
179181

182+
// gh-16647
183+
@Test
184+
public void createDecoderWhenCachingRemovedThenReturnNewDecoder() {
185+
ClientRegistration clientRegistration = this.registration.build();
186+
ReactiveJwtDecoder decoder1 = this.idTokenDecoderFactory.createDecoder(clientRegistration);
187+
ReactiveJwtDecoder decoder2 = this.idTokenDecoderFactory.createDecoder(clientRegistration);
188+
assertThat(decoder1).isNotSameAs(decoder2);
189+
}
190+
180191
}

0 commit comments

Comments
 (0)