Support Custom Principal in Jwt Authentication Flow
Closes gh-6237 Signed-off-by: Andrey Litvitski <andrey1010102008@gmail.com>
This commit is contained in:
committed by
Josh Cummings
parent
d3474e704f
commit
aabc9fc1cc
+24
-2
@@ -23,6 +23,7 @@ import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.security.authentication.AbstractAuthenticationToken;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.FactorGrantedAuthority;
|
||||
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
|
||||
import org.springframework.security.oauth2.jwt.Jwt;
|
||||
import org.springframework.security.oauth2.jwt.JwtClaimNames;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -32,12 +33,14 @@ import org.springframework.util.Assert;
|
||||
* @author Josh Cummings
|
||||
* @author Evgeniy Cheban
|
||||
* @author Olivier Antoine
|
||||
* @author Andrey Litvitski
|
||||
* @since 5.1
|
||||
*/
|
||||
public class JwtAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> {
|
||||
|
||||
private static final String AUTHORITY = FactorGrantedAuthority.BEARER_AUTHORITY;
|
||||
|
||||
private Converter<Jwt, OAuth2AuthenticatedPrincipal> jwtPrincipalConverter;
|
||||
private Converter<Jwt, Collection<GrantedAuthority>> jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
|
||||
|
||||
private String principalClaimName = JwtClaimNames.SUB;
|
||||
@@ -46,8 +49,27 @@ public class JwtAuthenticationConverter implements Converter<Jwt, AbstractAuthen
|
||||
public final AbstractAuthenticationToken convert(Jwt jwt) {
|
||||
Collection<GrantedAuthority> authorities = new HashSet<>(this.jwtGrantedAuthoritiesConverter.convert(jwt));
|
||||
authorities.add(FactorGrantedAuthority.fromAuthority(AUTHORITY));
|
||||
String principalClaimValue = jwt.getClaimAsString(this.principalClaimName);
|
||||
return new JwtAuthenticationToken(jwt, authorities, principalClaimValue);
|
||||
|
||||
if (this.jwtPrincipalConverter == null) {
|
||||
String principalClaimValue = jwt.getClaimAsString(this.principalClaimName);
|
||||
return new JwtAuthenticationToken(jwt, authorities, principalClaimValue);
|
||||
} else {
|
||||
OAuth2AuthenticatedPrincipal principal = this.jwtPrincipalConverter.convert(jwt);
|
||||
authorities.addAll(principal.getAuthorities());
|
||||
return new JwtAuthenticationToken(jwt, principal, authorities);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link Converter Converter<Jwt, Collection<OAuth2AuthenticatedPrincipal>>}
|
||||
* to use.
|
||||
* @param jwtPrincipalConverter The converter
|
||||
* @since 6.5.0
|
||||
*/
|
||||
public void setJwtPrincipalConverter(
|
||||
Converter<Jwt, OAuth2AuthenticatedPrincipal> jwtPrincipalConverter) {
|
||||
Assert.notNull(jwtPrincipalConverter, "jwtPrincipalConverter cannot be null");
|
||||
this.jwtPrincipalConverter = jwtPrincipalConverter;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+18
@@ -22,6 +22,7 @@ import java.util.Map;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.AuthenticatedPrincipal;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.Transient;
|
||||
import org.springframework.security.oauth2.jwt.Jwt;
|
||||
@@ -32,6 +33,7 @@ import org.springframework.util.Assert;
|
||||
* {@link Jwt} {@code Authentication}.
|
||||
*
|
||||
* @author Joe Grandja
|
||||
* @author Andrey Litvitski
|
||||
* @since 5.1
|
||||
* @see AbstractOAuth2TokenAuthenticationToken
|
||||
* @see Jwt
|
||||
@@ -80,6 +82,22 @@ public class JwtAuthenticationToken extends AbstractOAuth2TokenAuthenticationTok
|
||||
this.name = builder.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a {@code JwtAuthenticationToken} using the provided parameters.
|
||||
* @param jwt the JWT
|
||||
* @param principal the principal
|
||||
* @param authorities the authorities assigned to the JWT
|
||||
*/
|
||||
public JwtAuthenticationToken(Jwt jwt, Object principal, Collection<? extends GrantedAuthority> authorities) {
|
||||
super(jwt, principal, jwt, authorities);
|
||||
this.setAuthenticated(true);
|
||||
if (principal instanceof AuthenticatedPrincipal) {
|
||||
this.name = ((AuthenticatedPrincipal) principal).getName();
|
||||
} else {
|
||||
this.name = jwt.getSubject();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> getTokenAttributes() {
|
||||
return this.getToken().getClaims();
|
||||
|
||||
+14
@@ -26,6 +26,7 @@ import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrinci
|
||||
import org.springframework.security.oauth2.core.OAuth2AccessToken;
|
||||
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
|
||||
import org.springframework.security.oauth2.jwt.Jwt;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* A {@link Converter} that takes a {@link Jwt} and converts it into a
|
||||
@@ -41,6 +42,7 @@ import org.springframework.security.oauth2.jwt.Jwt;
|
||||
* {@link BearerTokenAuthentication}.
|
||||
*
|
||||
* @author Josh Cummings
|
||||
* @author Andrey Litvitski
|
||||
* @since 5.2
|
||||
*/
|
||||
public final class JwtBearerTokenAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> {
|
||||
@@ -58,4 +60,16 @@ public final class JwtBearerTokenAuthenticationConverter implements Converter<Jw
|
||||
return new BearerTokenAuthentication(principal, accessToken, authorities);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link Converter Converter<Jwt, Collection<OAuth2AuthenticatedPrincipal>>}
|
||||
* to use.
|
||||
* @param jwtPrincipalConverter The converter
|
||||
* @since 6.5.0
|
||||
*/
|
||||
public void setJwtPrincipalConverter(
|
||||
Converter<Jwt, OAuth2AuthenticatedPrincipal> jwtPrincipalConverter) {
|
||||
Assert.notNull(jwtPrincipalConverter, "jwtPrincipalConverter cannot be null");
|
||||
this.jwtAuthenticationConverter.setJwtPrincipalConverter(jwtPrincipalConverter);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user