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