From 8bf27bf76b09892f0207a604d7f02cec024e031b Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期二, 28 十二月 2021 11:24:34 +0800
Subject: [PATCH] !127 add 新增数据脱敏注解,可根据菜单权限字符控制是否脱敏 Merge pull request !127 from Yjoioooo/auto-5403234-dev-1640272112776

---
 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java            |   23 +++++
 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java  |   68 +++++++++++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java         |   32 ++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java |   43 ++++++++++
 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestSensitive.java                |   35 ++++++++
 5 files changed, 201 insertions(+), 0 deletions(-)

diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java
new file mode 100644
index 0000000..ff17b09
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.ruoyi.common.enums.SensitiveStrategy;
+import com.ruoyi.common.jackson.SensitiveJsonSerializer;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 鏁版嵁鑴辨晱娉ㄨВ
+ * @author zhujie
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@JacksonAnnotationsInside
+@JsonSerialize(using = SensitiveJsonSerializer.class)
+public @interface Sensitive {
+    SensitiveStrategy strategy();
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java
new file mode 100644
index 0000000..5f9bf72
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java
@@ -0,0 +1,32 @@
+package com.ruoyi.common.enums;
+
+import cn.hutool.core.util.DesensitizedUtil;
+import java.util.function.Function;
+
+/**
+ * 鑴辨晱绛栫暐
+ *  @author Yjoioooo
+ */
+public enum SensitiveStrategy {
+
+    /** 韬唤璇佽劚鏁� */
+    ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)),
+
+    /** 鎵嬫満鍙疯劚鏁� */
+    PHONE(DesensitizedUtil::mobilePhone),
+
+    /**  鍦板潃鑴辨晱 */
+    ADDRESS(s -> DesensitizedUtil.address(s, 8));
+
+    //鍙嚜琛屾坊鍔犲叾浠栬劚鏁忕瓥鐣�
+
+    private final Function<String, String> desensitizer;
+
+    SensitiveStrategy(Function<String, String> desensitizer) {
+        this.desensitizer = desensitizer;
+    }
+
+    public Function<String, String> desensitizer() {
+        return desensitizer;
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java
new file mode 100644
index 0000000..2b4fef4
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java
@@ -0,0 +1,43 @@
+package com.ruoyi.common.jackson;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import com.ruoyi.common.annotation.Sensitive;
+import com.ruoyi.common.enums.SensitiveStrategy;
+import com.ruoyi.common.utils.SecurityUtils;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * 鏁版嵁鑴辨晱json搴忓垪鍖栧伐鍏�
+ * @author Yjoioooo
+ */
+public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
+
+    private SensitiveStrategy strategy;
+
+    @Override
+    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        if (SecurityUtils.isAdmin(SecurityUtils.getLoginUser().getUserId()) || SecurityUtils.getLoginUser().getMenuPermissions().contains("Sensitive")){
+            gen.writeString(value);
+        } else {
+            gen.writeString(strategy.desensitizer().apply(value));
+        }
+
+    }
+
+    @Override
+    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
+        Sensitive annotation = property.getAnnotation(Sensitive.class);
+        if (Objects.nonNull(annotation)&&Objects.equals(String.class, property.getType().getRawClass())) {
+            this.strategy = annotation.strategy();
+            return this;
+        }
+        return prov.findValueSerializer(property.getType(), property);
+    }
+}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java
new file mode 100644
index 0000000..30708cd
--- /dev/null
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java
@@ -0,0 +1,68 @@
+package com.ruoyi.demo.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.excel.ExcelResult;
+import com.ruoyi.common.utils.ValidatorUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.demo.domain.TestDemo;
+import com.ruoyi.demo.domain.TestSensitive;
+import com.ruoyi.demo.domain.bo.TestDemoBo;
+import com.ruoyi.demo.domain.bo.TestDemoImportVo;
+import com.ruoyi.demo.domain.vo.TestDemoVo;
+import com.ruoyi.demo.service.ITestDemoService;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 娴嬭瘯鍗曡〃Controller
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Validated
+@Api(value = "娴嬭瘯鏁版嵁鑴辨晱鎺у埗鍣�", tags = {"娴嬭瘯鏁版嵁鑴辨晱绠$悊"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/demo/sensitive")
+public class TestSensitiveController extends BaseController {
+
+    //榛樿涓篴dmin鐢ㄦ埛鍙婃嫢鏈塖ensitive鏉冮檺瀛楃鐢ㄦ埛涓嶅仛鑴辨晱
+    //1.閰嶇疆鑿滃崟鍔犲叆鏉冮檺瀛楃涓篠ensitive鐨勬寜閽�
+    //2.閰嶇疆闇�瑕佸厤闄ゆ暟鎹劚鏁忕殑瑙掕壊鍔犲叆Sensitive鏉冮檺
+    //3.瀹炰綋绫讳笂鍔犱笂鏁版嵁鑴辨晱娉ㄨВ
+    /**
+     * 娴嬭瘯鏁版嵁鑴辨晱
+     */
+    @ApiOperation("鏌ヨ娴嬭瘯鍗曡〃鍒楄〃")
+    @GetMapping()
+    public AjaxResult<TestSensitive> get() {
+        TestSensitive testSensitive = new TestSensitive()
+            .setIdCard("3333199910101212")
+            .setPhone("18888888888")
+            .setAddress("鍖椾含甯傛湞闃冲尯鏌愭煇鍥涘悎闄�1203瀹�");
+        return AjaxResult.success(testSensitive);
+    }
+
+}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestSensitive.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestSensitive.java
new file mode 100644
index 0000000..1fbf6b3
--- /dev/null
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestSensitive.java
@@ -0,0 +1,35 @@
+package com.ruoyi.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.ruoyi.common.annotation.Sensitive;
+import com.ruoyi.common.core.domain.BaseEntity;
+import com.ruoyi.common.enums.SensitiveStrategy;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 娴嬭瘯鍗曡〃瀵硅薄 test_demo
+ *
+ * @author Lion Li
+ * @date 2021-07-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+public class TestSensitive extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /** 韬唤璇� */
+    @Sensitive(strategy = SensitiveStrategy.ID_CARD)
+    private String idCard;
+
+    /** 鐢佃瘽 */
+    @Sensitive(strategy = SensitiveStrategy.PHONE)
+    private String phone;
+
+    /** 鍦板潃 */
+    @Sensitive(strategy = SensitiveStrategy.ADDRESS)
+    private String address;
+}

--
Gitblit v1.9.3