From 2cbca21adb30ad958f9a56bf70aa137bc6d8c09c Mon Sep 17 00:00:00 2001 From: lijiahang Date: Fri, 30 Jun 2023 11:14:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20spring-boot-desens?= =?UTF-8?q?itize=20starter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 31 ++++++++ .../OrionDesensitizeAutoConfiguration.java | 25 ++++++ .../handler/DesensitizeResultHandler.java | 50 ++++++++++++ .../core/processor/IDesensitizeProcessor.java | 19 +++++ .../processor/ObjectDesensitizeProcessor.java | 78 +++++++++++++++++++ .../WrapperDesensitizeProcessor.java | 26 +++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + 7 files changed, 230 insertions(+) create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/pom.xml create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/config/OrionDesensitizeAutoConfiguration.java create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/handler/DesensitizeResultHandler.java create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/IDesensitizeProcessor.java create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/ObjectDesensitizeProcessor.java create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/WrapperDesensitizeProcessor.java create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/pom.xml b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/pom.xml new file mode 100644 index 00000000..bd6ae297 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/pom.xml @@ -0,0 +1,31 @@ + + + + com.orion.ops + orion-ops-framework + ${revision} + + + 4.0.0 + orion-ops-spring-boot-starter-desensitize + ${project.artifactId} + jar + + 项目数据脱敏包 + https://github.com/lijiahangmax/orion-ops-pro + + + + com.orion.ops + orion-ops-common + + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/config/OrionDesensitizeAutoConfiguration.java b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/config/OrionDesensitizeAutoConfiguration.java new file mode 100644 index 00000000..4cd6d2cb --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/config/OrionDesensitizeAutoConfiguration.java @@ -0,0 +1,25 @@ +package com.orion.ops.framework.desensitize.config; + +import com.orion.ops.framework.desensitize.core.handler.DesensitizeResultHandler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +/** + * 数据脱敏置类 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/6/29 16:55 + */ +@AutoConfiguration +public class OrionDesensitizeAutoConfiguration { + + /** + * @return 返回结果脱敏处理器 + */ + @Bean + public DesensitizeResultHandler desensitizeResultHandler() { + return new DesensitizeResultHandler(); + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/handler/DesensitizeResultHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/handler/DesensitizeResultHandler.java new file mode 100644 index 00000000..2af038f6 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/handler/DesensitizeResultHandler.java @@ -0,0 +1,50 @@ +package com.orion.ops.framework.desensitize.core.handler; + +import com.orion.lang.define.wrapper.Wrapper; +import com.orion.ops.framework.common.constant.ResponseAdviceOrderConst; +import com.orion.ops.framework.common.annotation.DoDesensitize; +import com.orion.ops.framework.desensitize.core.processor.IDesensitizeProcessor; +import com.orion.ops.framework.desensitize.core.processor.ObjectDesensitizeProcessor; +import com.orion.ops.framework.desensitize.core.processor.WrapperDesensitizeProcessor; +import org.jetbrains.annotations.NotNull; +import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.Order; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * 返回结果脱敏处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/6/15 17:38 + */ +@Order(ResponseAdviceOrderConst.DESENSITIZE) +@ControllerAdvice +public class DesensitizeResultHandler implements ResponseBodyAdvice { + + @Override + public boolean supports(MethodParameter methodParameter, @NotNull Class converterType) { + return methodParameter.hasMethodAnnotation(DoDesensitize.class); + } + + @Override + public Object beforeBodyWrite(Object body, @NotNull MethodParameter methodParameter, @NotNull MediaType selectedContentType, @NotNull Class selectedConverterType, + @NotNull ServerHttpRequest request, @NotNull ServerHttpResponse response) { + IDesensitizeProcessor processor; + if (body instanceof Wrapper) { + // wrapper + processor = new WrapperDesensitizeProcessor(); + } else { + // 普通对象 + processor = new ObjectDesensitizeProcessor(); + } + // 执行脱敏 + processor.execute(body); + return body; + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/IDesensitizeProcessor.java b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/IDesensitizeProcessor.java new file mode 100644 index 00000000..09ca6ad0 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/IDesensitizeProcessor.java @@ -0,0 +1,19 @@ +package com.orion.ops.framework.desensitize.core.processor; + +/** + * 脱敏处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/6/29 17:50 + */ +public interface IDesensitizeProcessor { + + /** + * 脱敏操作 + * + * @param data data + */ + void execute(T data); + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/ObjectDesensitizeProcessor.java b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/ObjectDesensitizeProcessor.java new file mode 100644 index 00000000..f882f4f4 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/ObjectDesensitizeProcessor.java @@ -0,0 +1,78 @@ +package com.orion.ops.framework.desensitize.core.processor; + +import com.orion.lang.utils.reflect.Annotations; +import com.orion.lang.utils.reflect.Methods; +import com.orion.ops.framework.common.utils.Desensitizes; +import com.orion.ops.framework.common.annotation.Desensitize; +import com.orion.ops.framework.common.annotation.DoDesensitize; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; + +/** + * 对象脱敏处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/6/29 17:21 + */ +public class ObjectDesensitizeProcessor implements IDesensitizeProcessor { + + @Override + public void execute(Object data) { + if (data == null) { + return; + } + Class dataClass = data.getClass(); + // 获取被标注脱敏的字段 + Map annotatedFields = Annotations.getAnnotatedFields(dataClass, Desensitize.class, true); + annotatedFields.forEach((f, d) -> { + // 获取 getter 方法 + Method getter = Methods.getGetterMethodByCache(dataClass, f.getName()); + if (!getter.getReturnType().equals(String.class)) { + // 非 string 不进行脱敏操作 + return; + } + // 调用 getter 方法 + String value = Methods.invokeMethod(data, getter); + if (value == null) { + // 为 null 不进行脱敏操作 + return; + } + // 数据脱敏 + String desensitizeValue = this.valueDesensitize(value, d); + // 获取 setter 方法 + Method setter = Methods.getSetterMethodByCache(dataClass, f.getName()); + // 调用 setter 方法 + Methods.invokeMethod(data, setter, desensitizeValue); + }); + // 获取被标注脱敏字段的对象 + Map annotatedObjects = Annotations.getAnnotatedFields(dataClass, DoDesensitize.class, true); + annotatedObjects.forEach((f, d) -> { + // 获取 getter 方法 + Method getter = Methods.getGetterMethodByCache(dataClass, f.getName()); + // 调用 getter 方法 + Object value = Methods.invokeMethod(data, getter); + if (value == null) { + // 为 null 不进行脱敏操作 + return; + } + // 执行对象脱敏操作 + this.execute(value); + }); + return; + } + + /** + * 数据脱敏 + * + * @param value value + * @param c 配置 + * @return 脱敏字符 + */ + private String valueDesensitize(String value, Desensitize c) { + return Desensitizes.mix(value, c.keepStart(), c.keepEnd(), c.replacer()); + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/WrapperDesensitizeProcessor.java b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/WrapperDesensitizeProcessor.java new file mode 100644 index 00000000..9ec1c456 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/java/com/orion/ops/framework/desensitize/core/processor/WrapperDesensitizeProcessor.java @@ -0,0 +1,26 @@ +package com.orion.ops.framework.desensitize.core.processor; + +import com.orion.lang.define.wrapper.HttpWrapper; +import com.orion.lang.define.wrapper.RpcWrapper; + +/** + * wrapper 对象脱敏处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/6/29 18:17 + */ +public class WrapperDesensitizeProcessor extends ObjectDesensitizeProcessor { + + @Override + public void execute(Object data) { + if (data instanceof HttpWrapper) { + super.execute(((HttpWrapper) data).getData()); + } else if (data instanceof RpcWrapper) { + super.execute(data); + } else { + super.execute(data); + } + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..1a3ddfe9 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-desensitize/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.orion.ops.framework.desensitize.config.OrionDesensitizeAutoConfiguration \ No newline at end of file