Rename property to authorities-claim-expressions

See gh-48490
This commit is contained in:
Andy Wilkinson
2026-03-16 10:35:57 +00:00
parent 8fff41b3ec
commit f2981d1bdc
5 changed files with 44 additions and 42 deletions
@@ -71,11 +71,11 @@ class JwtConverterConfiguration {
private Converter<Jwt, Collection<GrantedAuthority>> grantedAuthoritiesConverter( private Converter<Jwt, Collection<GrantedAuthority>> grantedAuthoritiesConverter(
OAuth2ResourceServerProperties.Jwt properties) { OAuth2ResourceServerProperties.Jwt properties) {
List<String> authoritiesExpressions = properties.getAuthoritiesExpressions(); List<String> authoritiesClaimExpressions = properties.getAuthoritiesClaimExpressions();
if (CollectionUtils.isEmpty(authoritiesExpressions)) { if (CollectionUtils.isEmpty(authoritiesClaimExpressions)) {
return createJwtGrantedAuthoritiesConverter(properties); return createJwtGrantedAuthoritiesConverter(properties);
} }
return createExpressionJwtGrantedAuthoritiesConverters(properties, authoritiesExpressions); return createExpressionJwtGrantedAuthoritiesConverters(properties, authoritiesClaimExpressions);
} }
private Converter<Jwt, Collection<GrantedAuthority>> createJwtGrantedAuthoritiesConverter( private Converter<Jwt, Collection<GrantedAuthority>> createJwtGrantedAuthoritiesConverter(
@@ -89,13 +89,13 @@ class JwtConverterConfiguration {
} }
private Converter<Jwt, Collection<GrantedAuthority>> createExpressionJwtGrantedAuthoritiesConverters( private Converter<Jwt, Collection<GrantedAuthority>> createExpressionJwtGrantedAuthoritiesConverters(
OAuth2ResourceServerProperties.Jwt properties, List<String> authoritiesExpressions) { OAuth2ResourceServerProperties.Jwt properties, List<String> claimExpressions) {
checkMutualExclusivity(properties); checkMutualExclusivity(properties);
List<Converter<Jwt, Collection<GrantedAuthority>>> converters = new ArrayList<>(); List<Converter<Jwt, Collection<GrantedAuthority>>> converters = new ArrayList<>();
SpelExpressionParser parser = new SpelExpressionParser(); SpelExpressionParser parser = new SpelExpressionParser();
for (String authoritiesExpression : authoritiesExpressions) { for (String claimExpression : claimExpressions) {
ExpressionJwtGrantedAuthoritiesConverter converter = new ExpressionJwtGrantedAuthoritiesConverter( ExpressionJwtGrantedAuthoritiesConverter converter = new ExpressionJwtGrantedAuthoritiesConverter(
parser.parseExpression(authoritiesExpression)); parser.parseExpression(claimExpression));
if (properties.getAuthorityPrefix() != null) { if (properties.getAuthorityPrefix() != null) {
converter.setAuthorityPrefix(properties.getAuthorityPrefix()); converter.setAuthorityPrefix(properties.getAuthorityPrefix());
} }
@@ -106,14 +106,14 @@ class JwtConverterConfiguration {
private void checkMutualExclusivity(OAuth2ResourceServerProperties.Jwt properties) { private void checkMutualExclusivity(OAuth2ResourceServerProperties.Jwt properties) {
MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> { MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> {
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-expressions", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions",
properties.getAuthoritiesExpressions()); properties.getAuthoritiesClaimExpressions());
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-name", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-name",
properties.getAuthoritiesClaimName()); properties.getAuthoritiesClaimName());
}, (value) -> !nullOrEmptyList(value)); }, (value) -> !nullOrEmptyList(value));
MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> { MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> {
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-expressions", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions",
properties.getAuthoritiesExpressions()); properties.getAuthoritiesClaimExpressions());
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter",
properties.getAuthoritiesClaimDelimiter()); properties.getAuthoritiesClaimDelimiter());
}, (value) -> !nullOrEmptyList(value)); }, (value) -> !nullOrEmptyList(value));
@@ -155,8 +155,8 @@ class JwtConverterConfiguration {
static class OnAuthoritiesExpressionsCondition extends OnPropertyListCondition { static class OnAuthoritiesExpressionsCondition extends OnPropertyListCondition {
OnAuthoritiesExpressionsCondition() { OnAuthoritiesExpressionsCondition() {
super("spring.security.oauth2.resourceserver.jwt.authorities-expressions", super("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions",
() -> ConditionMessage.forCondition("Authorities expressions")); () -> ConditionMessage.forCondition("Authorities claim expressions"));
} }
} }
@@ -104,7 +104,7 @@ public class OAuth2ResourceServerProperties {
* 'spring.security.oauth2.resourceserver.jwt.authorities-claim-name' and * 'spring.security.oauth2.resourceserver.jwt.authorities-claim-name' and
* 'spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter'. * 'spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter'.
*/ */
private List<String> authoritiesExpressions = new ArrayList<>(); private List<String> authoritiesClaimExpressions = new ArrayList<>();
/** /**
* JWT principal claim name. * JWT principal claim name.
@@ -175,12 +175,12 @@ public class OAuth2ResourceServerProperties {
this.authoritiesClaimName = authoritiesClaimName; this.authoritiesClaimName = authoritiesClaimName;
} }
public List<String> getAuthoritiesExpressions() { public List<String> getAuthoritiesClaimExpressions() {
return this.authoritiesExpressions; return this.authoritiesClaimExpressions;
} }
public void setAuthoritiesExpressions(List<String> authoritiesExpressions) { public void setAuthoritiesExpressions(List<String> authoritiesExpressions) {
this.authoritiesExpressions = authoritiesExpressions; this.authoritiesClaimExpressions = authoritiesExpressions;
} }
public @Nullable String getPrincipalClaimName() { public @Nullable String getPrincipalClaimName() {
@@ -77,11 +77,11 @@ class ReactiveJwtConverterConfiguration {
private Converter<Jwt, Collection<GrantedAuthority>> grantedAuthoritiesConverter( private Converter<Jwt, Collection<GrantedAuthority>> grantedAuthoritiesConverter(
OAuth2ResourceServerProperties.Jwt properties) { OAuth2ResourceServerProperties.Jwt properties) {
List<String> authoritiesExpressions = properties.getAuthoritiesExpressions(); List<String> authoritiesClaimExpressions = properties.getAuthoritiesClaimExpressions();
if (CollectionUtils.isEmpty(authoritiesExpressions)) { if (CollectionUtils.isEmpty(authoritiesClaimExpressions)) {
return createJwtGrantedAuthoritiesConverter(properties); return createJwtGrantedAuthoritiesConverter(properties);
} }
return createExpressionJwtGrantedAuthoritiesConverters(properties, authoritiesExpressions); return createExpressionJwtGrantedAuthoritiesConverters(properties, authoritiesClaimExpressions);
} }
private Converter<Jwt, Collection<GrantedAuthority>> createJwtGrantedAuthoritiesConverter( private Converter<Jwt, Collection<GrantedAuthority>> createJwtGrantedAuthoritiesConverter(
@@ -95,13 +95,13 @@ class ReactiveJwtConverterConfiguration {
} }
private Converter<Jwt, Collection<GrantedAuthority>> createExpressionJwtGrantedAuthoritiesConverters( private Converter<Jwt, Collection<GrantedAuthority>> createExpressionJwtGrantedAuthoritiesConverters(
OAuth2ResourceServerProperties.Jwt properties, List<String> authoritiesExpressions) { OAuth2ResourceServerProperties.Jwt properties, List<String> claimExpressions) {
checkMutualExclusivity(properties); checkMutualExclusivity(properties);
List<Converter<Jwt, Collection<GrantedAuthority>>> converters = new ArrayList<>(); List<Converter<Jwt, Collection<GrantedAuthority>>> converters = new ArrayList<>();
SpelExpressionParser parser = new SpelExpressionParser(); SpelExpressionParser parser = new SpelExpressionParser();
for (String authoritiesExpression : authoritiesExpressions) { for (String claimExpression : claimExpressions) {
ExpressionJwtGrantedAuthoritiesConverter converter = new ExpressionJwtGrantedAuthoritiesConverter( ExpressionJwtGrantedAuthoritiesConverter converter = new ExpressionJwtGrantedAuthoritiesConverter(
parser.parseExpression(authoritiesExpression)); parser.parseExpression(claimExpression));
if (properties.getAuthorityPrefix() != null) { if (properties.getAuthorityPrefix() != null) {
converter.setAuthorityPrefix(properties.getAuthorityPrefix()); converter.setAuthorityPrefix(properties.getAuthorityPrefix());
} }
@@ -112,14 +112,14 @@ class ReactiveJwtConverterConfiguration {
private void checkMutualExclusivity(OAuth2ResourceServerProperties.Jwt properties) { private void checkMutualExclusivity(OAuth2ResourceServerProperties.Jwt properties) {
MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> { MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> {
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-expressions", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions",
properties.getAuthoritiesExpressions()); properties.getAuthoritiesClaimExpressions());
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-name", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-name",
properties.getAuthoritiesClaimName()); properties.getAuthoritiesClaimName());
}, (value) -> !nullOrEmptyList(value)); }, (value) -> !nullOrEmptyList(value));
MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> { MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleMatchingValuesIn((entries) -> {
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-expressions", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions",
properties.getAuthoritiesExpressions()); properties.getAuthoritiesClaimExpressions());
entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter", entries.put("spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter",
properties.getAuthoritiesClaimDelimiter()); properties.getAuthoritiesClaimDelimiter());
}, (value) -> !nullOrEmptyList(value)); }, (value) -> !nullOrEmptyList(value));
@@ -161,8 +161,8 @@ class ReactiveJwtConverterConfiguration {
static class OnAuthoritiesExpressionsCondition extends OnPropertyListCondition { static class OnAuthoritiesExpressionsCondition extends OnPropertyListCondition {
OnAuthoritiesExpressionsCondition() { OnAuthoritiesExpressionsCondition() {
super("spring.security.oauth2.resourceserver.jwt.authorities-expressions", super("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions",
() -> ConditionMessage.forCondition("Authorities expressions")); () -> ConditionMessage.forCondition("Authorities claim expressions"));
} }
} }
@@ -693,7 +693,8 @@ class OAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldConfigureJwtConverterIfAuthoritiesExpressionIsSet() { void shouldConfigureJwtConverterIfAuthoritiesExpressionIsSet() {
this.contextRunner.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions=zero") this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions=zero")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(JwtAuthenticationConverter.class); assertThat(context).hasSingleBean(JwtAuthenticationConverter.class);
JwtAuthenticationConverter converter = context.getBean(JwtAuthenticationConverter.class); JwtAuthenticationConverter converter = context.getBean(JwtAuthenticationConverter.class);
@@ -707,8 +708,8 @@ class OAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldConfigureJwtConverterIfAuthoritiesExpressionsAreSet() { void shouldConfigureJwtConverterIfAuthoritiesExpressionsAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-expressions[1]=one") "spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[1]=one")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(JwtAuthenticationConverter.class); assertThat(context).hasSingleBean(JwtAuthenticationConverter.class);
JwtAuthenticationConverter converter = context.getBean(JwtAuthenticationConverter.class); JwtAuthenticationConverter converter = context.getBean(JwtAuthenticationConverter.class);
@@ -723,8 +724,8 @@ class OAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldApplyCustomAuthorityPrefixIfAuthoritiesExpressionsAreSet() { void shouldApplyCustomAuthorityPrefixIfAuthoritiesExpressionsAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-expressions[1]=one", "spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[1]=one",
"spring.security.oauth2.resourceserver.jwt.authority-prefix=CUSTOM_") "spring.security.oauth2.resourceserver.jwt.authority-prefix=CUSTOM_")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(JwtAuthenticationConverter.class); assertThat(context).hasSingleBean(JwtAuthenticationConverter.class);
@@ -740,7 +741,7 @@ class OAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimDelimiterAreSet() { void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimDelimiterAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter=delimiter") "spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter=delimiter")
.run((context) -> assertThat(context).getFailure() .run((context) -> assertThat(context).getFailure()
.rootCause() .rootCause()
@@ -750,7 +751,7 @@ class OAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimNameAreSet() { void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimNameAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-claim-name=name") "spring.security.oauth2.resourceserver.jwt.authorities-claim-name=name")
.run((context) -> assertThat(context).getFailure() .run((context) -> assertThat(context).getFailure()
.rootCause() .rootCause()
@@ -682,7 +682,8 @@ class ReactiveOAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldConfigureJwtConverterIfAuthoritiesExpressionIsSet() { void shouldConfigureJwtConverterIfAuthoritiesExpressionIsSet() {
this.contextRunner.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions=zero") this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions=zero")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class); assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class);
ReactiveJwtAuthenticationConverter converter = context ReactiveJwtAuthenticationConverter converter = context
@@ -697,8 +698,8 @@ class ReactiveOAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldConfigureJwtConverterIfAuthoritiesExpressionsAreSet() { void shouldConfigureJwtConverterIfAuthoritiesExpressionsAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-expressions[1]=one") "spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[1]=one")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class); assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class);
ReactiveJwtAuthenticationConverter converter = context ReactiveJwtAuthenticationConverter converter = context
@@ -715,8 +716,8 @@ class ReactiveOAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldApplyCustomAuthorityPrefixIfAuthoritiesExpressionsAreSet() { void shouldApplyCustomAuthorityPrefixIfAuthoritiesExpressionsAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-expressions[1]=one", "spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[1]=one",
"spring.security.oauth2.resourceserver.jwt.authority-prefix=CUSTOM_") "spring.security.oauth2.resourceserver.jwt.authority-prefix=CUSTOM_")
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class); assertThat(context).hasSingleBean(ReactiveJwtAuthenticationConverter.class);
@@ -734,7 +735,7 @@ class ReactiveOAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimDelimiterAreSet() { void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimDelimiterAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter=delimiter") "spring.security.oauth2.resourceserver.jwt.authorities-claim-delimiter=delimiter")
.run((context) -> assertThat(context).getFailure() .run((context) -> assertThat(context).getFailure()
.rootCause() .rootCause()
@@ -744,7 +745,7 @@ class ReactiveOAuth2ResourceServerAutoConfigurationTests {
@Test @Test
void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimNameAreSet() { void shouldFailIfBothAuthoritiesExpressionsAndAuthoritiesClaimNameAreSet() {
this.contextRunner this.contextRunner
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-expressions[0]=zero", .withPropertyValues("spring.security.oauth2.resourceserver.jwt.authorities-claim-expressions[0]=zero",
"spring.security.oauth2.resourceserver.jwt.authorities-claim-name=name") "spring.security.oauth2.resourceserver.jwt.authorities-claim-name=name")
.run((context) -> assertThat(context).getFailure() .run((context) -> assertThat(context).getFailure()
.rootCause() .rootCause()