Parcourir la source

feat: 支持 vo 返回的脱敏

gaibu il y a 2 ans
Parent
commit
61a34ddac5

+ 13 - 1
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/DesensitizationHandler.java

@@ -1,16 +1,28 @@
 package cn.iocoder.yudao.framework.desensitize.handler;
 
+import java.lang.annotation.Annotation;
+
 /**
  * 脱敏处理器接口
  */
-public interface DesensitizationHandler {
+public interface DesensitizationHandler<T extends Annotation> {
 
     /**
      * 脱敏
      *
      * @param origin 原始字符串
+     * @param arg    参数
      * @return 脱敏后的字符串
      */
     String desensitize(String origin, Object... arg);
 
+    /**
+     * 获取注解参数
+     *
+     * @param anno 注解
+     * @return 注解参数
+     */
+    default Object[] getAnnotationArgs(T anno) {
+        return new Object[0];
+    }
 }

+ 8 - 1
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/RegexDesensitizationHandler.java

@@ -1,9 +1,11 @@
 package cn.iocoder.yudao.framework.desensitize.handler;
 
+import cn.iocoder.yudao.framework.desensitize.annotation.RegexDesensitize;
+
 /**
  * 正则脱敏处理器
  */
-public class RegexDesensitizationHandler implements DesensitizationHandler {
+public class RegexDesensitizationHandler implements DesensitizationHandler<RegexDesensitize> {
 
     @Override
     public String desensitize(String origin, Object... arg) {
@@ -13,4 +15,9 @@ public class RegexDesensitizationHandler implements DesensitizationHandler {
         return origin.replaceAll(regex, replacer);
     }
 
+    @Override
+    public Object[] getAnnotationArgs(RegexDesensitize anno) {
+        return new Object[]{anno.regex(), anno.replacer()};
+    }
+
 }

+ 8 - 1
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/SliderDesensitizationHandler.java

@@ -1,9 +1,11 @@
 package cn.iocoder.yudao.framework.desensitize.handler;
 
+import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize;
+
 /**
  * 滑动脱敏处理器
  */
-public class SliderDesensitizationHandler implements DesensitizationHandler {
+public class SliderDesensitizationHandler implements DesensitizationHandler<SliderDesensitize> {
 
     @Override
     public String desensitize(String origin, Object... arg) {
@@ -29,6 +31,11 @@ public class SliderDesensitizationHandler implements DesensitizationHandler {
                 origin.substring(prefixKeep + interval);
     }
 
+    @Override
+    public Object[] getAnnotationArgs(SliderDesensitize anno) {
+        return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
+    }
+
     /**
      * 根据长度循环构建替换符
      *

+ 15 - 5
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/serializer/StringDesensitizeSerializer.java

@@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.ser.ContextualSerializer;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 
 import java.io.IOException;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 
 /**
@@ -64,7 +65,7 @@ public class StringDesensitizeSerializer extends StdSerializer<String> implement
         // 滑动处理器
         SliderDesensitize sliderDesensitize = ArrayUtil.firstNonNull(AnnotationUtil.getCombinationAnnotations(field, SliderDesensitize.class));
         if (sliderDesensitize != null) {
-            value = this.desensitizationHandler.desensitize(value, sliderDesensitize.prefixKeep(), sliderDesensitize.suffixKeep(), sliderDesensitize.replacer());
+            value = this.desensitizationHandler.desensitize(value, this.desensitizationHandler.getAnnotationArgs(sliderDesensitize));
             gen.writeString(value);
             return;
         }
@@ -72,15 +73,24 @@ public class StringDesensitizeSerializer extends StdSerializer<String> implement
         // 正则处理器
         RegexDesensitize regexDesensitize = ArrayUtil.firstNonNull(AnnotationUtil.getCombinationAnnotations(field, RegexDesensitize.class));
         if (regexDesensitize != null) {
-            value = this.desensitizationHandler.desensitize(value, regexDesensitize.regex(), regexDesensitize.replacer());
+            value = this.desensitizationHandler.desensitize(value, this.desensitizationHandler.getAnnotationArgs(regexDesensitize));
             gen.writeString(value);
             return;
         }
 
         // 自定义处理器
-        Desensitize desensitize = ArrayUtil.firstNonNull(AnnotationUtil.getCombinationAnnotations(field, Desensitize.class));
-        if (desensitize != null) {
-            value = this.desensitizationHandler.desensitize(value);
+        Desensitize[] annotations = AnnotationUtil.getCombinationAnnotations(field, Desensitize.class);
+        if (ArrayUtil.isEmpty(annotations)) {
+            gen.writeString(value);
+            return;
+        }
+
+        for (Annotation annotation : field.getAnnotations()) {
+            if (AnnotationUtil.hasAnnotation(annotation.annotationType(), Desensitize.class)) {
+                value = this.desensitizationHandler.desensitize(value, this.desensitizationHandler.getAnnotationArgs(annotation));
+                gen.writeString(value);
+                return;
+            }
         }
 
         gen.writeString(value);