SpringSecurityJackson2Module.java

  1. package cn.home1.oss.lib.common;

  2. import com.fasterxml.jackson.core.JsonGenerator;
  3. import com.fasterxml.jackson.core.JsonParser;
  4. import com.fasterxml.jackson.core.JsonToken;
  5. import com.fasterxml.jackson.databind.DeserializationContext;
  6. import com.fasterxml.jackson.databind.JsonDeserializer;
  7. import com.fasterxml.jackson.databind.JsonSerializer;
  8. import com.fasterxml.jackson.databind.ObjectMapper;
  9. import com.fasterxml.jackson.databind.SerializerProvider;
  10. import com.fasterxml.jackson.databind.module.SimpleModule;

  11. import lombok.extern.slf4j.Slf4j;

  12. import org.springframework.core.env.PropertyResolver;

  13. import java.io.IOException;

  14. @Slf4j
  15. public class SpringSecurityJackson2Module extends SimpleModule {

  16.   private static final long serialVersionUID = 1L;

  17.   public SpringSecurityJackson2Module() {
  18.     super();
  19.     try {
  20.       // TODO remove all SimpleGrantedAuthority.
  21.       Class.forName("org.springframework.security.core.GrantedAuthority");
  22.       addSerializer(org.springframework.security.core.GrantedAuthority.class, new GrantedAuthoritySerializer());
  23.       addDeserializer(org.springframework.security.core.GrantedAuthority.class, new GrantedAuthorityDeserializer());
  24.       addSerializer(org.springframework.security.core.authority.SimpleGrantedAuthority.class, //
  25.         new GrantedAuthoritySerializer());
  26.       addDeserializer(org.springframework.security.core.authority.SimpleGrantedAuthority.class, //
  27.         new GrantedAuthorityDeserializer());
  28.     } catch (final ClassNotFoundException ignored) {
  29.       log.debug("class not found, skip SpringSecurityJackson2Module", ignored);
  30.     }
  31.   }

  32.   /**
  33.    * jackson2 module for spring security (
  34.    * {@link org.springframework.security.core.GrantedAuthority},
  35.    * {@link org.springframework.security.core.authority.SimpleGrantedAuthority}
  36.    * ).
  37.    *
  38.    * @author zhanghaolun
  39.    */
  40.   public enum Jackson2SpringSecurityConfigurator implements Jackson2Configurator<Jackson2Configurator.BuildinJackson2Configurators> {
  41.     JACKSON2_SPRINGSECURITY_CONFIGURATOR {
  42.       @Override
  43.       public <M extends ObjectMapper> M config(final PropertyResolver propertyResolver, final M mapper) {
  44.         mapper.registerModule(new SpringSecurityJackson2Module());
  45.         return mapper;
  46.       }
  47.     };

  48.     @Override
  49.     public abstract <M extends ObjectMapper> M config(PropertyResolver propertyResolver, M mapper);
  50.   }

  51.   public static class GrantedAuthoritySerializer //
  52.     extends JsonSerializer<org.springframework.security.core.GrantedAuthority> {

  53.     @Override
  54.     public void serialize( //
  55.       final org.springframework.security.core.GrantedAuthority value, //
  56.       final JsonGenerator jsonGenerator, //
  57.       final SerializerProvider provider //
  58.     ) throws IOException {
  59.       jsonGenerator.writeString(value.toString());
  60.     }
  61.   }

  62.   public static class GrantedAuthorityDeserializer //
  63.     extends JsonDeserializer<org.springframework.security.core.authority.SimpleGrantedAuthority> {

  64.     @Override
  65.     public org.springframework.security.core.authority.SimpleGrantedAuthority deserialize( //
  66.       final JsonParser jsonParser, //
  67.       final DeserializationContext deserializationContext //
  68.     ) throws IOException {
  69.       final org.springframework.security.core.authority.SimpleGrantedAuthority grantedAuthority;
  70.       final JsonToken currentToken = jsonParser.getCurrentToken();

  71.       if (JsonToken.VALUE_STRING.equals(currentToken)) {
  72.         try {
  73.           final String grantedAuthorityString = jsonParser.getText().trim();
  74.           grantedAuthority = new org.springframework.security.core.authority.SimpleGrantedAuthority( //
  75.             grantedAuthorityString);
  76.           return grantedAuthority;
  77.         } catch (final Exception translated) {
  78.           throw new Jackson2Utils.RuntimeJsonProcessingException("couldn't parse GrantedAuthority", translated);
  79.         }
  80.       } else {
  81.         throw new IllegalStateException();
  82.       }
  83.     }
  84.   }
  85. }