Commit e7f8e0c50799ee8136bcd70f15c09746c554068b

Authored by 芋道源码
Committed by Gitee
2 parents 8791ea21 729ec31d

!372 支持 vo 返回脱敏

Merge pull request !372 from 与或非/issues/I3QPZV
Showing 33 changed files with 1105 additions and 0 deletions
yudao-dependencies/pom.xml
... ... @@ -143,6 +143,11 @@
143 143 <artifactId>yudao-spring-boot-starter-captcha</artifactId>
144 144 <version>${revision}</version>
145 145 </dependency>
  146 + <dependency>
  147 + <groupId>cn.iocoder.boot</groupId>
  148 + <artifactId>yudao-spring-boot-starter-desensitize</artifactId>
  149 + <version>${revision}</version>
  150 + </dependency>
146 151  
147 152 <!-- Spring 核心 -->
148 153 <dependency>
... ...
yudao-framework/pom.xml
... ... @@ -41,6 +41,7 @@
41 41 <module>yudao-spring-boot-starter-flowable</module>
42 42 <module>yudao-spring-boot-starter-captcha</module>
43 43 <module>yudao-spring-boot-starter-websocket</module>
  44 + <module>yudao-spring-boot-starter-desensitize</module>
44 45 </modules>
45 46  
46 47 <artifactId>yudao-framework</artifactId>
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/pom.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5 + <modelVersion>4.0.0</modelVersion>
  6 + <parent>
  7 + <artifactId>yudao-framework</artifactId>
  8 + <groupId>cn.iocoder.boot</groupId>
  9 + <version>${revision}</version>
  10 + </parent>
  11 +
  12 + <artifactId>yudao-spring-boot-starter-desensitize</artifactId>
  13 + <description>脱敏组件:支持 JSON 返回数据时,将邮箱、手机等字段进行脱敏</description>
  14 +
  15 + <dependencies>
  16 + <dependency>
  17 + <groupId>cn.iocoder.boot</groupId>
  18 + <artifactId>yudao-common</artifactId>
  19 + </dependency>
  20 +
  21 + <!-- jackson -->
  22 + <dependency>
  23 + <groupId>com.fasterxml.jackson.core</groupId>
  24 + <artifactId>jackson-annotations</artifactId>
  25 + </dependency>
  26 + <dependency>
  27 + <groupId>com.fasterxml.jackson.core</groupId>
  28 + <artifactId>jackson-databind</artifactId>
  29 + </dependency>
  30 +
  31 + <!-- Test 测试相关 -->
  32 + <dependency>
  33 + <groupId>cn.iocoder.boot</groupId>
  34 + <artifactId>yudao-spring-boot-starter-test</artifactId>
  35 + <scope>test</scope>
  36 + </dependency>
  37 + </dependencies>
  38 +</project>
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/annotation/DesensitizeBy.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.base.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  4 +import cn.iocoder.yudao.framework.desensitize.core.base.serializer.StringDesensitizeSerializer;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  7 +
  8 +import java.lang.annotation.Documented;
  9 +import java.lang.annotation.ElementType;
  10 +import java.lang.annotation.Retention;
  11 +import java.lang.annotation.RetentionPolicy;
  12 +import java.lang.annotation.Target;
  13 +
  14 +/**
  15 + * 顶级脱敏注解,自定义注解需要使用此注解
  16 + *
  17 + * @author gaibu
  18 + */
  19 +@Documented
  20 +@Target(ElementType.ANNOTATION_TYPE)
  21 +@Retention(RetentionPolicy.RUNTIME)
  22 +@JacksonAnnotationsInside // 此注解是其他所有 jackson 注解的元注解,打上了此注解的注解表明是 jackson 注解的一部分
  23 +@JsonSerialize(using = StringDesensitizeSerializer.class) // 指定序列化器
  24 +public @interface DesensitizeBy {
  25 +
  26 + /**
  27 + * 脱敏处理器
  28 + */
  29 + @SuppressWarnings("rawtypes")
  30 + Class<? extends DesensitizationHandler> handler();
  31 +
  32 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/handler/DesensitizationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.base.handler;
  2 +
  3 +import java.lang.annotation.Annotation;
  4 +
  5 +/**
  6 + * 脱敏处理器接口
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public interface DesensitizationHandler<T extends Annotation> {
  11 +
  12 + /**
  13 + * 脱敏
  14 + *
  15 + * @param origin 原始字符串
  16 + * @param annotation 注解信息
  17 + * @return 脱敏后的字符串
  18 + */
  19 + String desensitize(String origin, T annotation);
  20 +
  21 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.base.serializer;
  2 +
  3 +import cn.hutool.core.annotation.AnnotationUtil;
  4 +import cn.hutool.core.lang.Singleton;
  5 +import cn.hutool.core.util.ArrayUtil;
  6 +import cn.hutool.core.util.ReflectUtil;
  7 +import cn.hutool.core.util.StrUtil;
  8 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  9 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  10 +import com.fasterxml.jackson.core.JsonGenerator;
  11 +import com.fasterxml.jackson.databind.BeanProperty;
  12 +import com.fasterxml.jackson.databind.JsonSerializer;
  13 +import com.fasterxml.jackson.databind.SerializerProvider;
  14 +import com.fasterxml.jackson.databind.ser.ContextualSerializer;
  15 +import com.fasterxml.jackson.databind.ser.std.StdSerializer;
  16 +import lombok.Getter;
  17 +import lombok.Setter;
  18 +
  19 +import java.io.IOException;
  20 +import java.lang.annotation.Annotation;
  21 +import java.lang.reflect.Field;
  22 +
  23 +/**
  24 + * 脱敏序列化器
  25 + *
  26 + * 实现 JSON 返回数据时,使用 {@link DesensitizationHandler} 对声明脱敏注解的字段,进行脱敏处理。
  27 + *
  28 + * @author gaibu
  29 + */
  30 +@SuppressWarnings("rawtypes")
  31 +public class StringDesensitizeSerializer extends StdSerializer<String> implements ContextualSerializer {
  32 +
  33 + @Getter
  34 + @Setter
  35 + private DesensitizationHandler desensitizationHandler;
  36 +
  37 + protected StringDesensitizeSerializer() {
  38 + super(String.class);
  39 + }
  40 +
  41 + @Override
  42 + public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) {
  43 + DesensitizeBy annotation = beanProperty.getAnnotation(DesensitizeBy.class);
  44 + if (annotation == null) {
  45 + return this;
  46 + }
  47 + // 创建一个 StringDesensitizeSerializer 对象,使用 DesensitizeBy 对应的处理器
  48 + StringDesensitizeSerializer serializer = new StringDesensitizeSerializer();
  49 + serializer.setDesensitizationHandler(Singleton.get(annotation.handler()));
  50 + return serializer;
  51 + }
  52 +
  53 + @Override
  54 + @SuppressWarnings("unchecked")
  55 + public void serialize(String value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
  56 + if (StrUtil.isBlank(value)) {
  57 + gen.writeNull();
  58 + return;
  59 + }
  60 + // 获取序列化字段
  61 + Field field = getField(gen);
  62 +
  63 + // 自定义处理器
  64 + DesensitizeBy[] annotations = AnnotationUtil.getCombinationAnnotations(field, DesensitizeBy.class);
  65 + if (ArrayUtil.isEmpty(annotations)) {
  66 + gen.writeString(value);
  67 + return;
  68 + }
  69 + for (Annotation annotation : field.getAnnotations()) {
  70 + if (AnnotationUtil.hasAnnotation(annotation.annotationType(), DesensitizeBy.class)) {
  71 + value = this.desensitizationHandler.desensitize(value, annotation);
  72 + gen.writeString(value);
  73 + return;
  74 + }
  75 + }
  76 + gen.writeString(value);
  77 + }
  78 +
  79 + /**
  80 + * 获取字段
  81 + *
  82 + * @param generator JsonGenerator
  83 + * @return 字段
  84 + */
  85 + private Field getField(JsonGenerator generator) {
  86 + String currentName = generator.getOutputContext().getCurrentName();
  87 + Object currentValue = generator.getCurrentValue();
  88 + Class<?> currentValueClass = currentValue.getClass();
  89 + return ReflectUtil.getField(currentValueClass, currentName);
  90 + }
  91 +
  92 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/package-info.java 0 → 100644
  1 +/**
  2 + * 脱敏组件:支持 JSON 返回数据时,将邮箱、手机等字段进行脱敏
  3 + */
  4 +package cn.iocoder.yudao.framework.desensitize.core;
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/EmailDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.regex.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.regex.handler.EmailDesensitizationHandler;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 邮箱脱敏注解
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = EmailDesensitizationHandler.class)
  23 +public @interface EmailDesensitize {
  24 +
  25 + /**
  26 + * 匹配的正则表达式
  27 + */
  28 + String regex() default "(^.)[^@]*(@.*$)";
  29 +
  30 + /**
  31 + * 替换规则,邮箱;
  32 + *
  33 + * 比如:example@gmail.com 脱敏之后 为e****@gmail.com
  34 + */
  35 + String replacer() default "$1****$2";
  36 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/RegexDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.regex.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.regex.handler.DefaultRegexDesensitizationHandler;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 正则脱敏注解
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = DefaultRegexDesensitizationHandler.class)
  23 +public @interface RegexDesensitize {
  24 +
  25 + /**
  26 + * 匹配的正则表达式(默认匹配所有)
  27 + */
  28 + String regex() default "^[\\s\\S]*$";
  29 +
  30 + /**
  31 + * 替换规则,会将匹配到的字符串全部替换成 replacer
  32 + *
  33 + * 例如:regex=123; replacer=******
  34 + * 原始字符串 123456789
  35 + * 脱敏后字符串 ******456789
  36 + */
  37 + String replacer() default "******";
  38 +}
... ...
yudao-framework/yudao-spring-boot-starter-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 +/**
  8 + * 正则表达式脱敏处理器抽象类,已实现通用的方法
  9 + *
  10 + * @author gaibu
  11 + */
  12 +public abstract class AbstractRegexDesensitizationHandler<T extends Annotation>
  13 + implements DesensitizationHandler<T> {
  14 +
  15 + @Override
  16 + public String desensitize(String origin, T annotation) {
  17 + String regex = getRegex(annotation);
  18 + String replacer = getReplacer(annotation);
  19 + return origin.replaceAll(regex, replacer);
  20 + }
  21 +
  22 + /**
  23 + * 获取注解上的 regex 参数
  24 + *
  25 + * @param annotation 注解信息
  26 + * @return 正则表达式
  27 + */
  28 + abstract String getRegex(T annotation);
  29 +
  30 + /**
  31 + * 获取注解上的 replacer 参数
  32 + *
  33 + * @param annotation 注解信息
  34 + * @return 待替换的字符串
  35 + */
  36 + abstract String getReplacer(T annotation);
  37 +
  38 +}
... ...
yudao-framework/yudao-spring-boot-starter-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 + * {@link RegexDesensitize} 的正则脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitizationHandler<RegexDesensitize> {
  11 +
  12 + @Override
  13 + String getRegex(RegexDesensitize annotation) {
  14 + return annotation.regex();
  15 + }
  16 +
  17 + @Override
  18 + String getReplacer(RegexDesensitize annotation) {
  19 + return annotation.replacer();
  20 + }
  21 +}
... ...
yudao-framework/yudao-spring-boot-starter-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 +/**
  6 + * {@link EmailDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class EmailDesensitizationHandler extends AbstractRegexDesensitizationHandler<EmailDesensitize> {
  11 +
  12 + @Override
  13 + String getRegex(EmailDesensitize annotation) {
  14 + return annotation.regex();
  15 + }
  16 +
  17 + @Override
  18 + String getReplacer(EmailDesensitize annotation) {
  19 + return annotation.replacer();
  20 + }
  21 +
  22 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/BankCardDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.BankCardDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 银行卡号
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = BankCardDesensitization.class)
  23 +public @interface BankCardDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 6;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 2;
  34 +
  35 + /**
  36 + * 替换规则,银行卡号;比如:9988002866797031脱敏之后为998800********31
  37 + */
  38 + String replacer() default "*";
  39 +
  40 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.CarLicenseDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 车牌号
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = CarLicenseDesensitization.class)
  23 +public @interface CarLicenseDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 3;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 1;
  34 +
  35 + /**
  36 + * 替换规则,车牌号;比如:粤A66666脱敏之后为粤A6***6
  37 + */
  38 + String replacer() default "*";
  39 +
  40 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.ChineseNameDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 中文名
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = ChineseNameDesensitization.class)
  23 +public @interface ChineseNameDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 1;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 0;
  34 +
  35 + /**
  36 + * 替换规则,中文名;比如:刘子豪脱敏之后为刘**
  37 + */
  38 + String replacer() default "*";
  39 +
  40 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.FixedPhoneDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 固定电话
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = FixedPhoneDesensitization.class)
  23 +public @interface FixedPhoneDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 4;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 2;
  34 +
  35 + /**
  36 + * 替换规则,固定电话;比如:01086551122脱敏之后为0108*****22
  37 + */
  38 + String replacer() default "*";
  39 +
  40 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/IdCardDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.IdCardDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 身份证
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = IdCardDesensitization.class)
  23 +public @interface IdCardDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 6;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 2;
  34 +
  35 + /**
  36 + * 替换规则,身份证号码;比如:530321199204074611脱敏之后为530321**********11
  37 + */
  38 + String replacer() default "*";
  39 +
  40 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/MobileDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.MobileDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 手机号
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = MobileDesensitization.class)
  23 +public @interface MobileDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 3;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 4;
  34 +
  35 + /**
  36 + * 替换规则,手机号;比如:13248765917脱敏之后为132****5917
  37 + */
  38 + String replacer() default "*";
  39 +
  40 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/PasswordDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.PasswordDesensitization;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 密码
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = PasswordDesensitization.class)
  23 +public @interface PasswordDesensitize {
  24 +
  25 + /**
  26 + * 前缀保留长度
  27 + */
  28 + int prefixKeep() default 0;
  29 +
  30 + /**
  31 + * 后缀保留长度
  32 + */
  33 + int suffixKeep() default 0;
  34 +
  35 + /**
  36 + * 替换规则,密码;
  37 + *
  38 + * 比如:123456脱敏之后为******
  39 + */
  40 + String replacer() default "*";
  41 +
  42 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/SliderDesensitize.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  4 +import cn.iocoder.yudao.framework.desensitize.core.slider.handler.DefaultDesensitizationHandler;
  5 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  6 +
  7 +import java.lang.annotation.Documented;
  8 +import java.lang.annotation.ElementType;
  9 +import java.lang.annotation.Retention;
  10 +import java.lang.annotation.RetentionPolicy;
  11 +import java.lang.annotation.Target;
  12 +
  13 +/**
  14 + * 滑动脱敏注解
  15 + *
  16 + * @author gaibu
  17 + */
  18 +@Documented
  19 +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@JacksonAnnotationsInside
  22 +@DesensitizeBy(handler = DefaultDesensitizationHandler.class)
  23 +public @interface SliderDesensitize {
  24 +
  25 + /**
  26 + * 后缀保留长度
  27 + */
  28 + int suffixKeep() default 0;
  29 +
  30 + /**
  31 + * 替换规则,会将前缀后缀保留后,全部替换成 replacer
  32 + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
  33 + * 原始字符串 123456
  34 + * 脱敏后 1***56
  35 + */
  36 + String replacer() default "*";
  37 +
  38 + /**
  39 + * 前缀保留长度
  40 + */
  41 + int prefixKeep() default 0;
  42 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractDesensitizationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  4 +
  5 +import java.lang.annotation.Annotation;
  6 +
  7 +/**
  8 + * 滑动脱敏处理器抽象类,已实现通用的方法
  9 + *
  10 + * @author gaibu
  11 + */
  12 +public abstract class AbstractDesensitizationHandler<T extends Annotation>
  13 + implements DesensitizationHandler<T> {
  14 +
  15 + @Override
  16 + public String desensitize(String origin, T annotation) {
  17 + int prefixKeep = getPrefixKeep(annotation);
  18 + int suffixKeep = getSuffixKeep(annotation);
  19 + String replacer = getReplacer(annotation);
  20 + int length = origin.length();
  21 +
  22 + // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换
  23 + if (prefixKeep >= length || suffixKeep >= length) {
  24 + return buildReplacerByLength(replacer, length);
  25 + }
  26 +
  27 + // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换
  28 + if ((prefixKeep + suffixKeep) >= length) {
  29 + return buildReplacerByLength(replacer, length);
  30 + }
  31 +
  32 + // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串
  33 + int interval = length - prefixKeep - suffixKeep;
  34 + return origin.substring(0, prefixKeep) +
  35 + buildReplacerByLength(replacer, interval) +
  36 + origin.substring(prefixKeep + interval);
  37 + }
  38 +
  39 + /**
  40 + * 根据长度循环构建替换符
  41 + *
  42 + * @param replacer 替换符
  43 + * @param length 长度
  44 + * @return 构建后的替换符
  45 + */
  46 + private String buildReplacerByLength(String replacer, int length) {
  47 + StringBuilder builder = new StringBuilder();
  48 + for (int i = 0; i < length; i++) {
  49 + builder.append(replacer);
  50 + }
  51 + return builder.toString();
  52 + }
  53 +
  54 + /**
  55 + * 前缀保留长度
  56 + *
  57 + * @param annotation 注解信息
  58 + * @return 前缀保留长度
  59 + */
  60 + abstract Integer getPrefixKeep(T annotation);
  61 +
  62 + /**
  63 + * 后缀保留长度
  64 + *
  65 + * @param annotation 注解信息
  66 + * @return 后缀保留长度
  67 + */
  68 + abstract Integer getSuffixKeep(T annotation);
  69 +
  70 + /**
  71 + * 替换符
  72 + *
  73 + * @param annotation 注解信息
  74 + * @return 替换符
  75 + */
  76 + abstract String getReplacer(T annotation);
  77 +
  78 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.BankCardDesensitize;
  4 +
  5 +/**
  6 + * {@link BankCardDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class BankCardDesensitization extends AbstractDesensitizationHandler<BankCardDesensitize> {
  11 +
  12 + @Override
  13 + Integer getPrefixKeep(BankCardDesensitize annotation) {
  14 + return annotation.prefixKeep();
  15 + }
  16 +
  17 + @Override
  18 + Integer getSuffixKeep(BankCardDesensitize annotation) {
  19 + return annotation.suffixKeep();
  20 + }
  21 +
  22 + @Override
  23 + String getReplacer(BankCardDesensitize annotation) {
  24 + return annotation.replacer();
  25 + }
  26 +
  27 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.CarLicenseDesensitize;
  4 +
  5 +/**
  6 + * {@link CarLicenseDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class CarLicenseDesensitization extends AbstractDesensitizationHandler<CarLicenseDesensitize> {
  11 + @Override
  12 + Integer getPrefixKeep(CarLicenseDesensitize annotation) {
  13 + return annotation.prefixKeep();
  14 + }
  15 +
  16 + @Override
  17 + Integer getSuffixKeep(CarLicenseDesensitize annotation) {
  18 + return annotation.suffixKeep();
  19 + }
  20 +
  21 + @Override
  22 + String getReplacer(CarLicenseDesensitize annotation) {
  23 + return annotation.replacer();
  24 + }
  25 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.ChineseNameDesensitize;
  4 +
  5 +/**
  6 + * {@link ChineseNameDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class ChineseNameDesensitization extends AbstractDesensitizationHandler<ChineseNameDesensitize> {
  11 +
  12 + @Override
  13 + Integer getPrefixKeep(ChineseNameDesensitize annotation) {
  14 + return annotation.prefixKeep();
  15 + }
  16 +
  17 + @Override
  18 + Integer getSuffixKeep(ChineseNameDesensitize annotation) {
  19 + return annotation.suffixKeep();
  20 + }
  21 +
  22 + @Override
  23 + String getReplacer(ChineseNameDesensitize annotation) {
  24 + return annotation.replacer();
  25 + }
  26 +
  27 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.SliderDesensitize;
  4 +
  5 +/**
  6 + * {@link SliderDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class DefaultDesensitizationHandler extends AbstractDesensitizationHandler<SliderDesensitize> {
  11 + @Override
  12 + Integer getPrefixKeep(SliderDesensitize annotation) {
  13 + return annotation.prefixKeep();
  14 + }
  15 +
  16 + @Override
  17 + Integer getSuffixKeep(SliderDesensitize annotation) {
  18 + return annotation.suffixKeep();
  19 + }
  20 +
  21 + @Override
  22 + String getReplacer(SliderDesensitize annotation) {
  23 + return annotation.replacer();
  24 + }
  25 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.FixedPhoneDesensitize;
  4 +
  5 +/**
  6 + * {@link FixedPhoneDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class FixedPhoneDesensitization extends AbstractDesensitizationHandler<FixedPhoneDesensitize> {
  11 + @Override
  12 + Integer getPrefixKeep(FixedPhoneDesensitize annotation) {
  13 + return annotation.prefixKeep();
  14 + }
  15 +
  16 + @Override
  17 + Integer getSuffixKeep(FixedPhoneDesensitize annotation) {
  18 + return annotation.suffixKeep();
  19 + }
  20 +
  21 + @Override
  22 + String getReplacer(FixedPhoneDesensitize annotation) {
  23 + return annotation.replacer();
  24 + }
  25 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.IdCardDesensitize;
  4 +
  5 +/**
  6 + * {@link IdCardDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class IdCardDesensitization extends AbstractDesensitizationHandler<IdCardDesensitize> {
  11 + @Override
  12 + Integer getPrefixKeep(IdCardDesensitize annotation) {
  13 + return annotation.prefixKeep();
  14 + }
  15 +
  16 + @Override
  17 + Integer getSuffixKeep(IdCardDesensitize annotation) {
  18 + return annotation.suffixKeep();
  19 + }
  20 +
  21 + @Override
  22 + String getReplacer(IdCardDesensitize annotation) {
  23 + return annotation.replacer();
  24 + }
  25 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/MobileDesensitization.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.MobileDesensitize;
  4 +
  5 +/**
  6 + * {@link MobileDesensitize} 的脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class MobileDesensitization extends AbstractDesensitizationHandler<MobileDesensitize> {
  11 +
  12 + @Override
  13 + Integer getPrefixKeep(MobileDesensitize annotation) {
  14 + return annotation.prefixKeep();
  15 + }
  16 +
  17 + @Override
  18 + Integer getSuffixKeep(MobileDesensitize annotation) {
  19 + return annotation.suffixKeep();
  20 + }
  21 +
  22 + @Override
  23 + String getReplacer(MobileDesensitize annotation) {
  24 + return annotation.replacer();
  25 + }
  26 +}
... ...
yudao-framework/yudao-spring-boot-starter-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.PasswordDesensitize;
  4 +
  5 +/**
  6 + * {@link PasswordDesensitize} 的码脱敏处理器
  7 + *
  8 + * @author gaibu
  9 + */
  10 +public class PasswordDesensitization extends AbstractDesensitizationHandler<PasswordDesensitize> {
  11 + @Override
  12 + Integer getPrefixKeep(PasswordDesensitize annotation) {
  13 + return annotation.prefixKeep();
  14 + }
  15 +
  16 + @Override
  17 + Integer getSuffixKeep(PasswordDesensitize annotation) {
  18 + return annotation.suffixKeep();
  19 + }
  20 +
  21 + @Override
  22 + String getReplacer(PasswordDesensitize annotation) {
  23 + return annotation.replacer();
  24 + }
  25 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/test/java/cn/iocoder/yudao/framework/desensitize/core/DesensitizeTest.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  4 +import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.EmailDesensitize;
  5 +import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.RegexDesensitize;
  6 +import cn.iocoder.yudao.framework.desensitize.core.annotation.Address;
  7 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.BankCardDesensitize;
  8 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.CarLicenseDesensitize;
  9 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.ChineseNameDesensitize;
  10 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.FixedPhoneDesensitize;
  11 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.IdCardDesensitize;
  12 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.PasswordDesensitize;
  13 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.MobileDesensitize;
  14 +import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.SliderDesensitize;
  15 +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  16 +import lombok.Data;
  17 +import org.junit.jupiter.api.Test;
  18 +
  19 +import static org.junit.jupiter.api.Assertions.*;
  20 +
  21 +/**
  22 + * {@link DesensitizeTest} 的单元测试
  23 + */
  24 +public class DesensitizeTest extends BaseMockitoUnitTest {
  25 +
  26 + @Test
  27 + public void test() {
  28 + // 准备参数
  29 + DesensitizeDemo desensitizeDemo = new DesensitizeDemo();
  30 + desensitizeDemo.setNickname("芋道源码");
  31 + desensitizeDemo.setBankCard("9988002866797031");
  32 + desensitizeDemo.setCarLicense("粤A66666");
  33 + desensitizeDemo.setFixedPhone("01086551122");
  34 + desensitizeDemo.setIdCard("530321199204074611");
  35 + desensitizeDemo.setPassword("123456");
  36 + desensitizeDemo.setPhoneNumber("13248765917");
  37 + desensitizeDemo.setSlider1("ABCDEFG");
  38 + desensitizeDemo.setSlider2("ABCDEFG");
  39 + desensitizeDemo.setSlider3("ABCDEFG");
  40 + desensitizeDemo.setEmail("1@email.com");
  41 + desensitizeDemo.setRegex("你好,我是芋道源码");
  42 + desensitizeDemo.setAddress("北京市海淀区上地十街10号");
  43 + desensitizeDemo.setOrigin("芋道源码");
  44 +
  45 + // 调用
  46 + DesensitizeDemo d = JsonUtils.parseObject(JsonUtils.toJsonString(desensitizeDemo), DesensitizeDemo.class);
  47 + // 断言
  48 + assertNotNull(d);
  49 + assertEquals("芋***", d.getNickname());
  50 + assertEquals("998800********31", d.getBankCard());
  51 + assertEquals("粤A6***6", d.getCarLicense());
  52 + assertEquals("0108*****22", d.getFixedPhone());
  53 + assertEquals("530321**********11", d.getIdCard());
  54 + assertEquals("******", d.getPassword());
  55 + assertEquals("132****5917", d.getPhoneNumber());
  56 + assertEquals("#######", d.getSlider1());
  57 + assertEquals("ABC*EFG", d.getSlider2());
  58 + assertEquals("*******", d.getSlider3());
  59 + assertEquals("1****@email.com", d.getEmail());
  60 + assertEquals("你好,我是*", d.getRegex());
  61 + assertEquals("北京市海淀区上地十街10号*", d.getAddress());
  62 + assertEquals("芋道源码", d.getOrigin());
  63 + }
  64 +
  65 + @Data
  66 + public static class DesensitizeDemo {
  67 +
  68 + @ChineseNameDesensitize
  69 + private String nickname;
  70 + @BankCardDesensitize
  71 + private String bankCard;
  72 + @CarLicenseDesensitize
  73 + private String carLicense;
  74 + @FixedPhoneDesensitize
  75 + private String fixedPhone;
  76 + @IdCardDesensitize
  77 + private String idCard;
  78 + @PasswordDesensitize
  79 + private String password;
  80 + @MobileDesensitize
  81 + private String phoneNumber;
  82 + @SliderDesensitize(prefixKeep = 6, suffixKeep = 1, replacer = "#")
  83 + private String slider1;
  84 + @SliderDesensitize(prefixKeep = 3, suffixKeep = 3)
  85 + private String slider2;
  86 + @SliderDesensitize(prefixKeep = 10)
  87 + private String slider3;
  88 + @EmailDesensitize
  89 + private String email;
  90 + @RegexDesensitize(regex = "芋道源码", replacer = "*")
  91 + private String regex;
  92 + @Address
  93 + private String address;
  94 + private String origin;
  95 +
  96 + }
  97 +
  98 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/test/java/cn/iocoder/yudao/framework/desensitize/core/annotation/Address.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.annotation;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.DesensitizeTest;
  4 +import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
  5 +import cn.iocoder.yudao.framework.desensitize.core.handler.AddressHandler;
  6 +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
  7 +
  8 +import java.lang.annotation.Documented;
  9 +import java.lang.annotation.ElementType;
  10 +import java.lang.annotation.Retention;
  11 +import java.lang.annotation.RetentionPolicy;
  12 +import java.lang.annotation.Target;
  13 +
  14 +/**
  15 + * 地址
  16 + *
  17 + * 用于 {@link DesensitizeTest} 测试使用
  18 + *
  19 + * @author gaibu
  20 + */
  21 +@Documented
  22 +@Target({ElementType.FIELD})
  23 +@Retention(RetentionPolicy.RUNTIME)
  24 +@JacksonAnnotationsInside
  25 +@DesensitizeBy(handler = AddressHandler.class)
  26 +public @interface Address {
  27 +
  28 + String replacer() default "*";
  29 +
  30 +}
... ...
yudao-framework/yudao-spring-boot-starter-desensitize/src/test/java/cn/iocoder/yudao/framework/desensitize/core/handler/AddressHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.desensitize.core.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.desensitize.core.DesensitizeTest;
  4 +import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
  5 +import cn.iocoder.yudao.framework.desensitize.core.annotation.Address;
  6 +
  7 +/**
  8 + * {@link Address} 的脱敏处理器
  9 + *
  10 + * 用于 {@link DesensitizeTest} 测试使用
  11 + */
  12 +public class AddressHandler implements DesensitizationHandler<Address> {
  13 +
  14 + @Override
  15 + public String desensitize(String origin, Address annotation) {
  16 + return origin + annotation.replacer();
  17 + }
  18 +
  19 +}
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/package-info.java
  1 +/**
  2 + * Web 框架,全局异常、API 日志等
  3 + */
1 4 package cn.iocoder.yudao.framework;
... ...