Skip to content

Commit 7da453e

Browse files
committed
Add possibility to customize JwkSource of NimbusJwtDecoder
Signed-off-by: Mark Bonnekessel <[email protected]>
1 parent 1a9f62d commit 7da453e

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java

+25-3
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ public static final class JwkSetUriJwtDecoderBuilder {
289289

290290
private Consumer<ConfigurableJWTProcessor<SecurityContext>> jwtProcessorCustomizer;
291291

292+
private Consumer<JWKSourceBuilder<SecurityContext>> jwkSourceBuilderCustomizer;
293+
292294
private JwkSetUriJwtDecoderBuilder(String jwkSetUri) {
293295
Assert.hasText(jwkSetUri, "jwkSetUri cannot be empty");
294296
this.jwkSetUri = (rest) -> jwkSetUri;
@@ -423,6 +425,20 @@ public JwkSetUriJwtDecoderBuilder jwtProcessorCustomizer(
423425
return this;
424426
}
425427

428+
/**
429+
* Use the given {@link Consumer} to customize the {@link JWKSourceBuilder} before
430+
* passing it to the build {@link NimbusJwtDecoder}.
431+
* @param jwkSourceBuilderCustomizer the callback used to alter the builder
432+
* @return a {@link JwkSetUriJwtDecoderBuilder} for further configurations
433+
* @since 6.5
434+
*/
435+
public JwkSetUriJwtDecoderBuilder jwkSourceBuilderCustomizer(
436+
Consumer<JWKSourceBuilder<SecurityContext>> jwkSourceBuilderCustomizer) {
437+
Assert.notNull(jwkSourceBuilderCustomizer, "jwkSourceBuilderCustomizer cannot be null");
438+
this.jwkSourceBuilderCustomizer = jwkSourceBuilderCustomizer;
439+
return this;
440+
}
441+
426442
JWSKeySelector<SecurityContext> jwsKeySelector(JWKSource<SecurityContext> jwkSource) {
427443
if (this.signatureAlgorithms.isEmpty()) {
428444
return new JWSVerificationKeySelector<>(this.defaultAlgorithms.apply(jwkSource), jwkSource);
@@ -437,11 +453,17 @@ JWSKeySelector<SecurityContext> jwsKeySelector(JWKSource<SecurityContext> jwkSou
437453

438454
JWKSource<SecurityContext> jwkSource() {
439455
String jwkSetUri = this.jwkSetUri.apply(this.restOperations);
440-
return JWKSourceBuilder.create(new SpringJWKSource<>(this.restOperations, this.cache, jwkSetUri))
456+
JWKSourceBuilder<SecurityContext> jwkSourceBuilder = JWKSourceBuilder
457+
.create(new SpringJWKSource<>(this.restOperations, this.cache, jwkSetUri))
441458
.refreshAheadCache(false)
442459
.rateLimited(false)
443-
.cache(this.cache instanceof NoOpCache)
444-
.build();
460+
.cache(this.cache instanceof NoOpCache);
461+
462+
if (this.jwkSourceBuilderCustomizer != null) {
463+
this.jwkSourceBuilderCustomizer.accept(jwkSourceBuilder);
464+
}
465+
466+
return jwkSourceBuilder.build();
445467
}
446468

447469
JWTProcessor<SecurityContext> processor() {

oauth2/oauth2-jose/src/test/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoderTests.java

+9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.Date;
3333
import java.util.List;
3434
import java.util.Map;
35+
import java.util.function.Consumer;
3536

3637
import javax.crypto.SecretKey;
3738

@@ -43,6 +44,7 @@
4344
import com.nimbusds.jose.crypto.MACSigner;
4445
import com.nimbusds.jose.crypto.RSASSASigner;
4546
import com.nimbusds.jose.jwk.source.JWKSource;
47+
import com.nimbusds.jose.jwk.source.JWKSourceBuilder;
4648
import com.nimbusds.jose.proc.BadJOSEException;
4749
import com.nimbusds.jose.proc.DefaultJOSEObjectTypeVerifier;
4850
import com.nimbusds.jose.proc.JWSKeySelector;
@@ -603,6 +605,13 @@ public void jwsKeySelectorWhenNoAlgorithmThenReturnsRS256Selector() {
603605
assertThat(jwsVerificationKeySelector.isAllowed(JWSAlgorithm.RS256)).isTrue();
604606
}
605607

608+
@Test
609+
public void jwkSourceIsCustomizable() {
610+
Consumer<JWKSourceBuilder<SecurityContext>> jwkSourceBuilderCustomizer = mock();
611+
NimbusJwtDecoder.withJwkSetUri(JWK_SET_URI).jwkSourceBuilderCustomizer(jwkSourceBuilderCustomizer).build();
612+
verify(jwkSourceBuilderCustomizer, times(1)).accept(any());
613+
}
614+
606615
@Test
607616
public void jwsKeySelectorWhenOneAlgorithmThenReturnsSingleSelector() {
608617
JWKSource<SecurityContext> jwkSource = mock(JWKSource.class);

0 commit comments

Comments
 (0)