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,6 +143,11 @@ | ||
| 143 | <artifactId>yudao-spring-boot-starter-captcha</artifactId> | 143 | <artifactId>yudao-spring-boot-starter-captcha</artifactId> |
| 144 | <version>${revision}</version> | 144 | <version>${revision}</version> |
| 145 | </dependency> | 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 | <!-- Spring 核心 --> | 152 | <!-- Spring 核心 --> |
| 148 | <dependency> | 153 | <dependency> |
yudao-framework/pom.xml
| @@ -41,6 +41,7 @@ | @@ -41,6 +41,7 @@ | ||
| 41 | <module>yudao-spring-boot-starter-flowable</module> | 41 | <module>yudao-spring-boot-starter-flowable</module> |
| 42 | <module>yudao-spring-boot-starter-captcha</module> | 42 | <module>yudao-spring-boot-starter-captcha</module> |
| 43 | <module>yudao-spring-boot-starter-websocket</module> | 43 | <module>yudao-spring-boot-starter-websocket</module> |
| 44 | + <module>yudao-spring-boot-starter-desensitize</module> | ||
| 44 | </modules> | 45 | </modules> |
| 45 | 46 | ||
| 46 | <artifactId>yudao-framework</artifactId> | 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 | +} |