Merge branch '4.0.x' into 4.1.x

Closes gh-51630
This commit is contained in:
Andy Wilkinson
2026-09-08 16:51:49 +01:00
5 changed files with 26 additions and 2 deletions
@@ -147,6 +147,11 @@ class JwtConverterConfiguration {
}
@ConditionalOnProperty("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter")
static class OnAuthoritiesClaimDelimiter {
}
@Conditional(OnAuthoritiesExpressionsCondition.class)
static class OnAuthoritiesExpressions {
@@ -153,6 +153,11 @@ class ReactiveJwtConverterConfiguration {
}
@ConditionalOnProperty("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter")
static class OnAuthoritiesClaimDelimiter {
}
@Conditional(OnAuthoritiesExpressionsCondition.class)
static class OnAuthoritiesExpressions {
@@ -53,7 +53,7 @@ public final class JwtConverterCustomizationsArgumentsProvider implements Argume
String principalClaimProperty = "spring.security.oauth2.resourceserver.jwt.principal-claim-name="
+ customPrincipalClaim;
String[] customPrefixProps = { jwkSetUriProperty, authorityPrefixProperty };
String[] customDelimiterProps = { jwkSetUriProperty, authorityPrefixProperty, authoritiesDelimiterProperty };
String[] customDelimiterProps = { jwkSetUriProperty, authoritiesDelimiterProperty };
String[] customAuthoritiesClaimProps = { jwkSetUriProperty, authoritiesClaimProperty };
String[] customPrincipalClaimProps = { jwkSetUriProperty, principalClaimProperty };
String[] allJwtConverterProps = { jwkSetUriProperty, authorityPrefixProperty, authoritiesDelimiterProperty,
@@ -84,7 +84,7 @@ public final class JwtConverterCustomizationsArgumentsProvider implements Argume
Arguments.of(Named.named("Custom prefix for GrantedAuthority", customPrefixProps),
noAuthoritiesCustomizationsJwt, subjectValue, customPrefixAuthorities),
Arguments.of(Named.named("Custom delimiter for JWT scopes", customDelimiterProps),
customAuthoritiesDelimiterJwt, subjectValue, customPrefixAuthorities),
customAuthoritiesDelimiterJwt, subjectValue, defaultPrefixAuthorities),
Arguments.of(Named.named("Custom JWT authority claim name", customAuthoritiesClaimProps),
customAuthoritiesClaimJwt, subjectValue, defaultPrefixAuthorities),
Arguments.of(Named.named("Custom JWT principal claim name", customPrincipalClaimProps),
@@ -783,6 +783,13 @@ class OAuth2ResourceServerAutoConfigurationTests {
.isInstanceOf(MutuallyExclusiveConfigurationPropertiesException.class));
}
@Test
void shouldConfigureJwtConverterIfAuthoritiesClaimDelimiterIsSet() {
this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter=dummy")
.run((context) -> assertThat(context).hasSingleBean(JwtAuthenticationConverter.class));
}
@Test
void jwtAuthenticationConverterByJwtConfigIsConditionalOnMissingBean() {
String propertiesPrincipalClaim = "principal_from_properties";
@@ -800,6 +800,13 @@ class ReactiveOAuth2ResourceServerAutoConfigurationTests {
.isInstanceOf(MutuallyExclusiveConfigurationPropertiesException.class));
}
@Test
void shouldConfigureJwtConverterIfAuthoritiesClaimDelimiterIsSet() {
this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter=dummy")
.run((context) -> assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class));
}
@ParameterizedTest(name = "{0}")
@ArgumentsSource(JwtConverterCustomizationsArgumentsProvider.class)
void autoConfigurationShouldConfigureResourceServerWithJwtConverterCustomizations(String[] properties, Jwt jwt,