Skip to content

Commit 25fb1f4

Browse files
evgeniychebanjzheaux
authored andcommitted
Added setPrincipalClaimName to JwtAuthenticationConverter
Fixes gh-8186
1 parent 420737f commit 25fb1f4

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

oauth2/oauth2-resource-server/src/main/java/org/springframework/security/oauth2/server/resource/authentication/JwtAuthenticationConverter.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,30 @@
2222
import org.springframework.security.authentication.AbstractAuthenticationToken;
2323
import org.springframework.security.core.GrantedAuthority;
2424
import org.springframework.security.oauth2.jwt.Jwt;
25+
import org.springframework.security.oauth2.jwt.JwtClaimNames;
2526
import org.springframework.util.Assert;
2627

2728
/**
2829
* @author Rob Winch
2930
* @author Josh Cummings
31+
* @author Evgeniy Cheban
3032
* @since 5.1
3133
*/
3234
public class JwtAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> {
3335
private Converter<Jwt, Collection<GrantedAuthority>> jwtGrantedAuthoritiesConverter
3436
= new JwtGrantedAuthoritiesConverter();
3537

38+
private String principalClaimName;
39+
3640
@Override
3741
public final AbstractAuthenticationToken convert(Jwt jwt) {
3842
Collection<GrantedAuthority> authorities = extractAuthorities(jwt);
39-
return new JwtAuthenticationToken(jwt, authorities);
43+
if (this.principalClaimName == null) {
44+
return new JwtAuthenticationToken(jwt, authorities);
45+
}
46+
47+
String name = jwt.getClaim(this.principalClaimName);
48+
return new JwtAuthenticationToken(jwt, authorities, name);
4049
}
4150

4251
/**
@@ -65,4 +74,16 @@ public void setJwtGrantedAuthoritiesConverter(Converter<Jwt, Collection<GrantedA
6574
Assert.notNull(jwtGrantedAuthoritiesConverter, "jwtGrantedAuthoritiesConverter cannot be null");
6675
this.jwtGrantedAuthoritiesConverter = jwtGrantedAuthoritiesConverter;
6776
}
77+
78+
/**
79+
* Sets the principal claim name.
80+
* Defaults to {@link JwtClaimNames#SUB}.
81+
*
82+
* @param principalClaimName The principal claim name
83+
* @since 5.4
84+
*/
85+
public void setPrincipalClaimName(String principalClaimName) {
86+
Assert.hasText(principalClaimName, "principalClaimName cannot be empty");
87+
this.principalClaimName = principalClaimName;
88+
}
6889
}

oauth2/oauth2-resource-server/src/test/java/org/springframework/security/oauth2/server/resource/authentication/JwtAuthenticationConverterTests.java

+32
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
* Tests for {@link JwtAuthenticationConverter}
3636
*
3737
* @author Josh Cummings
38+
* @author Evgeniy Cheban
3839
*/
3940
public class JwtAuthenticationConverterTests {
4041
JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
@@ -73,4 +74,35 @@ public void convertWithOverriddenGrantedAuthoritiesConverter() {
7374
assertThat(authorities).containsExactly(
7475
new SimpleGrantedAuthority("blah"));
7576
}
77+
78+
@Test
79+
public void whenSettingNullPrincipalClaimName() {
80+
assertThatIllegalArgumentException()
81+
.isThrownBy(() -> this.jwtAuthenticationConverter.setPrincipalClaimName(null))
82+
.withMessage("principalClaimName cannot be empty");
83+
}
84+
85+
@Test
86+
public void whenSettingEmptyPrincipalClaimName() {
87+
assertThatIllegalArgumentException()
88+
.isThrownBy(() -> this.jwtAuthenticationConverter.setPrincipalClaimName(""))
89+
.withMessage("principalClaimName cannot be empty");
90+
}
91+
92+
@Test
93+
public void whenSettingBlankPrincipalClaimName() {
94+
assertThatIllegalArgumentException()
95+
.isThrownBy(() -> this.jwtAuthenticationConverter.setPrincipalClaimName(" "))
96+
.withMessage("principalClaimName cannot be empty");
97+
}
98+
99+
@Test
100+
public void convertWhenPrincipalClaimNameSet() {
101+
this.jwtAuthenticationConverter.setPrincipalClaimName("user_id");
102+
103+
Jwt jwt = jwt().claim("user_id", "100").build();
104+
AbstractAuthenticationToken authentication = this.jwtAuthenticationConverter.convert(jwt);
105+
106+
assertThat(authentication.getName()).isEqualTo("100");
107+
}
76108
}

0 commit comments

Comments
 (0)