Commit c60f8d6da293fadf36ffd7fd0ddbb0793beca99b

Authored by gaibu
1 parent 61a34dda

feat: 支持 vo 返回的脱敏

Showing 28 changed files with 365 additions and 143 deletions
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/DesensitizationHandlerHolder.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/DesensitizationHandlerHolder.java
1 -package cn.iocoder.yudao.framework.desensitize.handler; 1 +package cn.iocoder.yudao.framework.desensitize.core.base;
2 2
3 import cn.hutool.core.util.ReflectUtil; 3 import cn.hutool.core.util.ReflectUtil;
  4 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  5 +import cn.iocoder.yudao.framework.desensitize.core.regex.handler.DefaultRegexDesensitizationHandler;
  6 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.DefaultDesensitizationHandler;
4 7
5 import java.util.Map; 8 import java.util.Map;
6 import java.util.concurrent.ConcurrentHashMap; 9 import java.util.concurrent.ConcurrentHashMap;
@@ -13,8 +16,8 @@ public class DesensitizationHandlerHolder { @@ -13,8 +16,8 @@ public class DesensitizationHandlerHolder {
13 * handler 缓存,默认初始化内置的处理器 16 * handler 缓存,默认初始化内置的处理器
14 */ 17 */
15 private static final Map<Class<? extends DesensitizationHandler>, DesensitizationHandler> HANDLER_MAP = new ConcurrentHashMap<>() {{ 18 private static final Map<Class<? extends DesensitizationHandler>, DesensitizationHandler> HANDLER_MAP = new ConcurrentHashMap<>() {{
16 - put(RegexDesensitizationHandler.class, new RegexDesensitizationHandler());  
17 - put(SliderDesensitizationHandler.class, new SliderDesensitizationHandler()); 19 + put(DefaultRegexDesensitizationHandler.class, new DefaultRegexDesensitizationHandler());
  20 + put(DefaultDesensitizationHandler.class, new DefaultDesensitizationHandler());
18 }}; 21 }};
19 22
20 public static DesensitizationHandler getDesensitizationHandler(Class<? extends DesensitizationHandler> clazz) { 23 public static DesensitizationHandler getDesensitizationHandler(Class<? extends DesensitizationHandler> clazz) {
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/Desensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/annotation/Desensitize.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation; 1 +package cn.iocoder.yudao.framework.desensitize.core.base.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.handler.DesensitizationHandler; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
4 import cn.iocoder.yudao.framework.desensitize.serializer.StringDesensitizeSerializer; 4 import cn.iocoder.yudao.framework.desensitize.serializer.StringDesensitizeSerializer;
5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
6 import com.fasterxml.jackson.databind.annotation.JsonSerialize; 6 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -16,7 +16,7 @@ import java.lang.annotation.Target; @@ -16,7 +16,7 @@ import java.lang.annotation.Target;
16 * Desensitize 顶级脱敏注解 16 * Desensitize 顶级脱敏注解
17 */ 17 */
18 @Documented 18 @Documented
19 -@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 19 +@Target({ ElementType.ANNOTATION_TYPE})
20 @Retention(RetentionPolicy.RUNTIME) 20 @Retention(RetentionPolicy.RUNTIME)
21 @JacksonAnnotationsInside 21 @JacksonAnnotationsInside
22 @JsonSerialize(using = StringDesensitizeSerializer.class) 22 @JsonSerialize(using = StringDesensitizeSerializer.class)
@@ -25,6 +25,5 @@ public @interface Desensitize { @@ -25,6 +25,5 @@ public @interface Desensitize {
25 /** 25 /**
26 * 脱敏处理器 26 * 脱敏处理器
27 */ 27 */
28 - Class<? extends DesensitizationHandler> desensitizationHandler();  
29 - 28 + Class<? extends DesensitizationHandler> desensitizationBy();
30 } 29 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/DesensitizationHandler.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/handler/DesensitizationHandler.java
1 -package cn.iocoder.yudao.framework.desensitize.handler; 1 +package cn.iocoder.yudao.framework.desensitize.core.base.handler;
2 2
3 import java.lang.annotation.Annotation; 3 import java.lang.annotation.Annotation;
4 4
@@ -11,18 +11,9 @@ public interface DesensitizationHandler&lt;T extends Annotation&gt; { @@ -11,18 +11,9 @@ public interface DesensitizationHandler&lt;T extends Annotation&gt; {
11 * 脱敏 11 * 脱敏
12 * 12 *
13 * @param origin 原始字符串 13 * @param origin 原始字符串
14 - * @param arg 参数 14 + * @param anno 注解信息
15 * @return 脱敏后的字符串 15 * @return 脱敏后的字符串
16 */ 16 */
17 - String desensitize(String origin, Object... arg); 17 + String desensitize(String origin, T anno);
18 18
19 - /**  
20 - * 获取注解参数  
21 - *  
22 - * @param anno 注解  
23 - * @return 注解参数  
24 - */  
25 - default Object[] getAnnotationArgs(T anno) {  
26 - return new Object[0];  
27 - }  
28 } 19 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/EmailDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/EmailDesensitize.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.regex.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.RegexDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.regex.handler.EmailDesensitizationHandler;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,18 @@ import java.lang.annotation.Target; @@ -16,6 +17,18 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@RegexDesensitize(regex = "(^.)[^@]*(@.*$)", replacer ="$1****$2") // 邮箱;比如:example@gmail.com脱敏之后为e****@gmail.com 20 +@Desensitize(desensitizationBy = EmailDesensitizationHandler.class) // 邮箱;比如:example@gmail.com脱敏之后为e****@gmail.com
20 public @interface EmailDesensitize { 21 public @interface EmailDesensitize {
  22 + /**
  23 + * 匹配的正则表达式(默认匹配所有)
  24 + */
  25 + String regex() default "(^.)[^@]*(@.*$)";
  26 +
  27 + /**
  28 + * 替换规则,会将匹配到的字符串全部替换成 replacer
  29 + * 例如:regex=123; replacer=******
  30 + * 原始字符串 123456789
  31 + * 脱敏后字符串 ******456789
  32 + */
  33 + String replacer() default "$1****$2";
21 } 34 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/RegexDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/RegexDesensitize.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation; 1 +package cn.iocoder.yudao.framework.desensitize.core.regex.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.handler.RegexDesensitizationHandler; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.regex.handler.DefaultRegexDesensitizationHandler;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,7 +17,7 @@ import java.lang.annotation.Target; @@ -16,7 +17,7 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 17 @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@Desensitize(desensitizationHandler = RegexDesensitizationHandler.class) 20 +@Desensitize(desensitizationBy = DefaultRegexDesensitizationHandler.class)
20 public @interface RegexDesensitize { 21 public @interface RegexDesensitize {
21 /** 22 /**
22 * 匹配的正则表达式(默认匹配所有) 23 * 匹配的正则表达式(默认匹配所有)
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.regex.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  4 +
  5 +import java.lang.annotation.Annotation;
  6 +
  7 +public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> implements DesensitizationHandler<T> {
  8 +
  9 + @Override
  10 + public String desensitize(String origin, T anno) {
  11 + Object[] args = getArgs(anno);
  12 + String regex = (String) args[0];
  13 + String replacer = (String) args[1];
  14 +
  15 + return origin.replaceAll(regex, replacer);
  16 + }
  17 +
  18 + /**
  19 + * 获取注解的参数
  20 + *
  21 + * @param anno 注解信息
  22 + * @return 注解的参数
  23 + */
  24 + abstract Object[] getArgs(T anno);
  25 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.regex.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.RegexDesensitize;
  4 +
  5 +/**
  6 + * 正则脱敏处理器
  7 + */
  8 +public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitizationHandler<RegexDesensitize> {
  9 +
  10 + @Override
  11 + Object[] getArgs(RegexDesensitize anno) {
  12 + return new Object[]{anno.regex(), anno.replacer()};
  13 + }
  14 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.regex.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.EmailDesensitize;
  4 +
  5 +public class EmailDesensitizationHandler extends AbstractRegexDesensitizationHandler<EmailDesensitize> {
  6 +
  7 + @Override
  8 + Object[] getArgs(EmailDesensitize anno) {
  9 + return new Object[]{anno.regex(), anno.replacer()};
  10 + }
  11 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/BankCardDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/BankCard.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.BankCardDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 6, suffixKeep = 2, replacer = "*") // 银行卡号;比如:9988002866797031脱敏之后为998800********31  
20 -public @interface BankCardDesensitize { 20 +@Desensitize(desensitizationBy = BankCardDesensitization.class)// 银行卡号;比如:9988002866797031脱敏之后为998800********31
  21 +public @interface BankCard {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 6;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 2;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/CarLicenseDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/CarLicense.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.CarLicenseDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 3, suffixKeep = 1, replacer = "*") // 车牌号;比如:粤A66666脱敏之后为粤A6***6  
20 -public @interface CarLicenseDesensitize { 20 +@Desensitize(desensitizationBy = CarLicenseDesensitization.class) // 车牌号;比如:粤A66666脱敏之后为粤A6***6
  21 +public @interface CarLicense {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 3;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 1;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/ChineseNameDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/ChineseName.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.ChineseNameDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 1, suffixKeep = 0, replacer = "*") // 中文名;比如:刘子豪脱敏之后为刘**  
20 -public @interface ChineseNameDesensitize { 20 +@Desensitize(desensitizationBy = ChineseNameDesensitization.class) // 中文名;比如:刘子豪脱敏之后为刘**
  21 +public @interface ChineseName {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 1;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 0;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/FixedPhoneDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/FixedPhone.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.FixedPhoneDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 4, suffixKeep = 2, replacer = "*") // 固定电话;比如:01086551122脱敏之后为0108*****22  
20 -public @interface FixedPhoneDesensitize { 20 +@Desensitize(desensitizationBy = FixedPhoneDesensitization.class) // 固定电话;比如:01086551122脱敏之后为0108*****22
  21 +public @interface FixedPhone {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 4;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 2;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/IdCardDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/IdCard.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.IdCardDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 6, suffixKeep = 2, replacer = "*") // 身份证号码;比如:530321199204074611脱敏之后为530321**********11  
20 -public @interface IdCardDesensitize { 20 +@Desensitize(desensitizationBy = IdCardDesensitization.class) // 身份证号码;比如:530321199204074611脱敏之后为530321**********11
  21 +public @interface IdCard {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 6;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 2;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/PasswordDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/Password.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.PasswordDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 0, suffixKeep = 0, replacer = "*") // 密码;比如:123456脱敏之后为******  
20 -public @interface PasswordDesensitize { 20 +@Desensitize(desensitizationBy = PasswordDesensitization.class) // 密码;比如:123456脱敏之后为******
  21 +public @interface Password {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 0;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 0;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/constraints/PhoneNumberDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/PhoneNumber.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation.constraints; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.PhoneNumberDesensitization;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,6 +17,25 @@ import java.lang.annotation.Target; @@ -16,6 +17,25 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD}) 17 @Target({ElementType.FIELD})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@SliderDesensitize(prefixKeep = 3, suffixKeep = 4, replacer = "*") // 手机号;比如:13248765917脱敏之后为132****5917  
20 -public @interface PhoneNumberDesensitize { 20 +@Desensitize(desensitizationBy = PhoneNumberDesensitization.class) // 手机号;比如:13248765917脱敏之后为132****5917
  21 +public @interface PhoneNumber {
  22 +
  23 + /**
  24 + * 前缀保留长度
  25 + */
  26 + int prefixKeep() default 3;
  27 +
  28 + /**
  29 + * 后缀保留长度
  30 + */
  31 + int suffixKeep() default 4;
  32 +
  33 + /**
  34 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  35 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  36 + * 原始字符串 123456
  37 + * 脱敏后 1***56
  38 + */
  39 + String replacer() default "*";
  40 +
21 } 41 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/annotation/SliderDesensitize.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/Slider.java
1 -package cn.iocoder.yudao.framework.desensitize.annotation; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.handler.SliderDesensitizationHandler; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.DefaultDesensitizationHandler;
4 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; 5 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
5 6
6 import java.lang.annotation.Documented; 7 import java.lang.annotation.Documented;
@@ -16,8 +17,8 @@ import java.lang.annotation.Target; @@ -16,8 +17,8 @@ import java.lang.annotation.Target;
16 @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 17 @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
18 @JacksonAnnotationsInside 19 @JacksonAnnotationsInside
19 -@Desensitize(desensitizationHandler = SliderDesensitizationHandler.class)  
20 -public @interface SliderDesensitize { 20 +@Desensitize(desensitizationBy = DefaultDesensitizationHandler.class)
  21 +public @interface Slider {
21 22
22 /** 23 /**
23 * 后缀保留长度 24 * 后缀保留长度
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/SliderDesensitizationHandler.java renamed to yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractDesensitizationHandler.java
1 -package cn.iocoder.yudao.framework.desensitize.handler; 1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
2 2
3 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize; 3 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
4 4
5 -/**  
6 - * 滑动脱敏处理器  
7 - */  
8 -public class SliderDesensitizationHandler implements DesensitizationHandler<SliderDesensitize> { 5 +import java.lang.annotation.Annotation;
  6 +
  7 +public abstract class AbstractDesensitizationHandler<T extends Annotation> implements DesensitizationHandler<T> {
9 8
10 @Override 9 @Override
11 - public String desensitize(String origin, Object... arg) {  
12 - int prefixKeep = (Integer) arg[0];  
13 - int suffixKeep = (Integer) arg[1];  
14 - String replacer = (String) arg[2]; 10 + public String desensitize(String origin, T anno) {
  11 + Object[] args = getArgs(anno);
  12 + int prefixKeep = (Integer) args[0];
  13 + int suffixKeep = (Integer) args[1];
  14 + String replacer = (String) args[2];
15 15
16 int length = origin.length(); 16 int length = origin.length();
17 17
@@ -31,10 +31,13 @@ public class SliderDesensitizationHandler implements DesensitizationHandler&lt;Slid @@ -31,10 +31,13 @@ public class SliderDesensitizationHandler implements DesensitizationHandler&lt;Slid
31 origin.substring(prefixKeep + interval); 31 origin.substring(prefixKeep + interval);
32 } 32 }
33 33
34 - @Override  
35 - public Object[] getAnnotationArgs(SliderDesensitize anno) {  
36 - return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};  
37 - } 34 + /**
  35 + * 获取注解的参数
  36 + *
  37 + * @param anno 注解信息
  38 + * @return 注解的参数
  39 + */
  40 + abstract Object[] getArgs(T anno);
38 41
39 /** 42 /**
40 * 根据长度循环构建替换符 43 * 根据长度循环构建替换符
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/BankCardDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.BankCard;
  4 +
  5 +public class BankCardDesensitization extends AbstractDesensitizationHandler<BankCard> {
  6 +
  7 + @Override
  8 + Object[] getArgs(BankCard anno) {
  9 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  10 + }
  11 +}
0 \ No newline at end of file 12 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.CarLicense;
  4 +
  5 +public class CarLicenseDesensitization extends AbstractDesensitizationHandler<CarLicense> {
  6 + @Override
  7 + Object[] getArgs(CarLicense anno) {
  8 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  9 + }
  10 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.ChineseName;
  4 +
  5 +public class ChineseNameDesensitization extends AbstractDesensitizationHandler<ChineseName> {
  6 + @Override
  7 + Object[] getArgs(ChineseName anno) {
  8 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  9 + }
  10 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.Slider;
  4 +
  5 +/**
  6 + * 滑动脱敏处理器
  7 + */
  8 +public class DefaultDesensitizationHandler extends AbstractDesensitizationHandler<Slider> {
  9 +
  10 + @Override
  11 + Object[] getArgs(Slider anno) {
  12 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  13 + }
  14 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.FixedPhone;
  4 +
  5 +public class FixedPhoneDesensitization extends AbstractDesensitizationHandler<FixedPhone> {
  6 + @Override
  7 + Object[] getArgs(FixedPhone anno) {
  8 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  9 + }
  10 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/IdCardDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.IdCard;
  4 +
  5 +public class IdCardDesensitization extends AbstractDesensitizationHandler<IdCard> {
  6 + @Override
  7 + Object[] getArgs(IdCard anno) {
  8 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  9 + }
  10 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/PasswordDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.Password;
  4 +
  5 +public class PasswordDesensitization extends AbstractDesensitizationHandler<Password> {
  6 + @Override
  7 + Object[] getArgs(Password anno) {
  8 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  9 + }
  10 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/PhoneNumberDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.PhoneNumber;
  4 +
  5 +public class PhoneNumberDesensitization extends AbstractDesensitizationHandler<PhoneNumber> {
  6 +
  7 + @Override
  8 + Object[] getArgs(PhoneNumber anno) {
  9 + return new Object[]{anno.prefixKeep(), anno.suffixKeep(), anno.replacer()};
  10 + }
  11 +}
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/handler/RegexDesensitizationHandler.java deleted
1 -package cn.iocoder.yudao.framework.desensitize.handler;  
2 -  
3 -import cn.iocoder.yudao.framework.desensitize.annotation.RegexDesensitize;  
4 -  
5 -/**  
6 - * 正则脱敏处理器  
7 - */  
8 -public class RegexDesensitizationHandler implements DesensitizationHandler<RegexDesensitize> {  
9 -  
10 - @Override  
11 - public String desensitize(String origin, Object... arg) {  
12 - String regex = (String) arg[0];  
13 - String replacer = (String) arg[1];  
14 -  
15 - return origin.replaceAll(regex, replacer);  
16 - }  
17 -  
18 - @Override  
19 - public Object[] getAnnotationArgs(RegexDesensitize anno) {  
20 - return new Object[]{anno.regex(), anno.replacer()};  
21 - }  
22 -  
23 -}  
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/serializer/StringDesensitizeSerializer.java
@@ -4,11 +4,9 @@ import cn.hutool.core.annotation.AnnotationUtil; @@ -4,11 +4,9 @@ import cn.hutool.core.annotation.AnnotationUtil;
4 import cn.hutool.core.util.ArrayUtil; 4 import cn.hutool.core.util.ArrayUtil;
5 import cn.hutool.core.util.ReflectUtil; 5 import cn.hutool.core.util.ReflectUtil;
6 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
7 -import cn.iocoder.yudao.framework.desensitize.annotation.Desensitize;  
8 -import cn.iocoder.yudao.framework.desensitize.annotation.RegexDesensitize;  
9 -import cn.iocoder.yudao.framework.desensitize.annotation.SliderDesensitize;  
10 -import cn.iocoder.yudao.framework.desensitize.handler.DesensitizationHandler;  
11 -import cn.iocoder.yudao.framework.desensitize.handler.DesensitizationHandlerHolder; 7 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.Desensitize;
  8 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  9 +import cn.iocoder.yudao.framework.desensitize.core.base.DesensitizationHandlerHolder;
12 import com.fasterxml.jackson.core.JsonGenerator; 10 import com.fasterxml.jackson.core.JsonGenerator;
13 import com.fasterxml.jackson.databind.BeanProperty; 11 import com.fasterxml.jackson.databind.BeanProperty;
14 import com.fasterxml.jackson.databind.JsonMappingException; 12 import com.fasterxml.jackson.databind.JsonMappingException;
@@ -46,7 +44,7 @@ public class StringDesensitizeSerializer extends StdSerializer&lt;String&gt; implement @@ -46,7 +44,7 @@ public class StringDesensitizeSerializer extends StdSerializer&lt;String&gt; implement
46 return this; 44 return this;
47 } 45 }
48 StringDesensitizeSerializer serializer = new StringDesensitizeSerializer(); 46 StringDesensitizeSerializer serializer = new StringDesensitizeSerializer();
49 - serializer.setDesensitizationHandler(DesensitizationHandlerHolder.getDesensitizationHandler(annotation.desensitizationHandler())); 47 + serializer.setDesensitizationHandler(DesensitizationHandlerHolder.getDesensitizationHandler(annotation.desensitizationBy()));
50 return serializer; 48 return serializer;
51 } 49 }
52 50
@@ -62,22 +60,6 @@ public class StringDesensitizeSerializer extends StdSerializer&lt;String&gt; implement @@ -62,22 +60,6 @@ public class StringDesensitizeSerializer extends StdSerializer&lt;String&gt; implement
62 Class<?> currentValueClass = currentValue.getClass(); 60 Class<?> currentValueClass = currentValue.getClass();
63 Field field = ReflectUtil.getField(currentValueClass, currentName); 61 Field field = ReflectUtil.getField(currentValueClass, currentName);
64 62
65 - // 滑动处理器  
66 - SliderDesensitize sliderDesensitize = ArrayUtil.firstNonNull(AnnotationUtil.getCombinationAnnotations(field, SliderDesensitize.class));  
67 - if (sliderDesensitize != null) {  
68 - value = this.desensitizationHandler.desensitize(value, this.desensitizationHandler.getAnnotationArgs(sliderDesensitize));  
69 - gen.writeString(value);  
70 - return;  
71 - }  
72 -  
73 - // 正则处理器  
74 - RegexDesensitize regexDesensitize = ArrayUtil.firstNonNull(AnnotationUtil.getCombinationAnnotations(field, RegexDesensitize.class));  
75 - if (regexDesensitize != null) {  
76 - value = this.desensitizationHandler.desensitize(value, this.desensitizationHandler.getAnnotationArgs(regexDesensitize));  
77 - gen.writeString(value);  
78 - return;  
79 - }  
80 -  
81 // 自定义处理器 63 // 自定义处理器
82 Desensitize[] annotations = AnnotationUtil.getCombinationAnnotations(field, Desensitize.class); 64 Desensitize[] annotations = AnnotationUtil.getCombinationAnnotations(field, Desensitize.class);
83 if (ArrayUtil.isEmpty(annotations)) { 65 if (ArrayUtil.isEmpty(annotations)) {
@@ -86,8 +68,9 @@ public class StringDesensitizeSerializer extends StdSerializer&lt;String&gt; implement @@ -86,8 +68,9 @@ public class StringDesensitizeSerializer extends StdSerializer&lt;String&gt; implement
86 } 68 }
87 69
88 for (Annotation annotation : field.getAnnotations()) { 70 for (Annotation annotation : field.getAnnotations()) {
  71 +
89 if (AnnotationUtil.hasAnnotation(annotation.annotationType(), Desensitize.class)) { 72 if (AnnotationUtil.hasAnnotation(annotation.annotationType(), Desensitize.class)) {
90 - value = this.desensitizationHandler.desensitize(value, this.desensitizationHandler.getAnnotationArgs(annotation)); 73 + value = this.desensitizationHandler.desensitize(value, annotation);
91 gen.writeString(value); 74 gen.writeString(value);
92 return; 75 return;
93 } 76 }
yudao-framework/yudao-spring-boot-starter-biz-desensitize/src/test/java/cn/iocoder/yudao/framework/desensitize/handler/DesensitizationHandlerTest.java deleted
1 -package cn.iocoder.yudao.framework.desensitize.handler;  
2 -  
3 -import org.junit.jupiter.api.Assertions;  
4 -import org.junit.jupiter.api.Test;  
5 -  
6 -public class DesensitizationHandlerTest {  
7 -  
8 - @Test  
9 - public void testSliderDesensitizationHandler() {  
10 - DesensitizationHandler handler = DesensitizationHandlerHolder.getDesensitizationHandler(SliderDesensitizationHandler.class);  
11 -  
12 - Assertions.assertEquals("A****FG", handler.desensitize("ABCDEFG", 1, 2, "*"));  
13 - Assertions.assertEquals("芋**码", handler.desensitize("芋道源码", 1, 1, "*"));  
14 - Assertions.assertEquals("****", handler.desensitize("芋道源码", 4, 0, "*"));  
15 - }  
16 -  
17 - @Test  
18 - public void testRegexDesensitizationHandler() {  
19 - DesensitizationHandler handler = DesensitizationHandlerHolder.getDesensitizationHandler(RegexDesensitizationHandler.class);  
20 -  
21 - Assertions.assertEquals("e****@gmail.com", handler.desensitize("example@gmail.com", "(^.)[^@]*(@.*$)", "$1****$2"));  
22 - Assertions.assertEquals("***,铁***", handler.desensitize("他妈的,铁废物", "他妈的|去你大爷|卧槽|草泥马|废物", "***"));  
23 - }  
24 -  
25 -}