SensitiveJsonSerializer.java 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package com.ruoyi.common.config.serializer;
  2. import java.io.IOException;
  3. import java.util.Objects;
  4. import com.fasterxml.jackson.core.JsonGenerator;
  5. import com.fasterxml.jackson.databind.BeanProperty;
  6. import com.fasterxml.jackson.databind.JsonMappingException;
  7. import com.fasterxml.jackson.databind.JsonSerializer;
  8. import com.fasterxml.jackson.databind.SerializerProvider;
  9. import com.fasterxml.jackson.databind.ser.ContextualSerializer;
  10. import com.ruoyi.common.annotation.Sensitive;
  11. import com.ruoyi.common.core.domain.model.LoginUser;
  12. import com.ruoyi.common.enums.DesensitizedType;
  13. import com.ruoyi.common.utils.SecurityUtils;
  14. /**
  15. * 数据脱敏序列化过滤
  16. *
  17. * @author ruoyi
  18. */
  19. public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer
  20. {
  21. private DesensitizedType desensitizedType;
  22. @Override
  23. public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException
  24. {
  25. if (desensitization())
  26. {
  27. gen.writeString(desensitizedType.desensitizer().apply(value));
  28. }
  29. else
  30. {
  31. gen.writeString(value);
  32. }
  33. }
  34. @Override
  35. public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
  36. throws JsonMappingException
  37. {
  38. Sensitive annotation = property.getAnnotation(Sensitive.class);
  39. if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass()))
  40. {
  41. this.desensitizedType = annotation.desensitizedType();
  42. return this;
  43. }
  44. return prov.findValueSerializer(property.getType(), property);
  45. }
  46. /**
  47. * 是否需要脱敏处理
  48. */
  49. private boolean desensitization()
  50. {
  51. try
  52. {
  53. LoginUser securityUser = SecurityUtils.getLoginUser();
  54. // 管理员不脱敏
  55. return !securityUser.getUser().isAdmin();
  56. }
  57. catch (Exception e)
  58. {
  59. return true;
  60. }
  61. }
  62. }