Search code examples
spring-bootspring-securityjwtspring-security-oauth2

JwtAccessTokenConverterConfigurer alternate?


I am using JwtAccessTokenConverterConfigurer interface in my security implementation to have oAuth2.0 for my Spring boot microservices.

I have implemented a JWTAccessTokenCustomizer with this. But I see JwtAccessTokenConverterConfigurer is deprecated. What is the alternate way I can do this now?

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.security.oauth2.resource.JwtAccessTokenConverterConfigurer
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
import org.springframework.security.core.Authentication
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.AuthorityUtils
import org.springframework.security.oauth2.provider.OAuth2Authentication
import org.springframework.security.oauth2.provider.OAuth2Request
import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter
import java.util.*

//FIXME: JwtAccessTokenConverterConfigurer is deprecated; do something
class JwtAccessTokenCustomizer() : DefaultAccessTokenConverter(), JwtAccessTokenConverterConfigurer

Solution

  • In Spring Security 5 you can implement the Converter<S, T> interface to add custom authorities conversion. From my understanding, this is the successor of the JwtAccessTokenConverterConfigurer. Here in java for extracting the roles claim and map it to the ROLE_ authority.

    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.SimpleGrantedAuthority;
    import org.springframework.security.oauth2.jwt.Jwt;
    import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
    import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
    
    import javax.validation.constraints.NotNull;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class CustomJwtAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> {
    
        private final JwtGrantedAuthoritiesConverter defaultGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
    
        public CustomJwtAuthenticationConverter() {
        }
    
        @Override
        public AbstractAuthenticationToken convert(@NotNull final Jwt jwt) {
            Collection<GrantedAuthority> authorities = Stream
                .concat(defaultGrantedAuthoritiesConverter.convert(jwt).stream(), extractResourceRoles(jwt).stream())
                .collect(Collectors.toSet());           
            return new JwtAuthenticationToken(jwt, authorities);
        }
        
        private static Collection<? extends GrantedAuthority> extractResourceRoles(final Jwt jwt) {
            Collection<String> userRoles = jwt.getClaimAsStringList("roles");
            if (userRoles != null)
                return userRoles
                          .stream()
                          .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                          .collect(Collectors.toSet());
            return Collections.emptySet();
        }
    }