Commit e7f8e0c50799ee8136bcd70f15c09746c554068b
Committed by
Gitee
!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
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 | +} | ... | ... |