Browse Source

!127 add 新增数据脱敏注解,可根据菜单权限字符控制是否脱敏
Merge pull request !127 from Yjoioooo/auto-5403234-dev-1640272112776

疯狂的狮子Li 3 years ago
parent
commit
8bf27bf76b

+ 23 - 0
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();
+}

+ 32 - 0
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;
+    }
+}

+ 43 - 0
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);
+    }
+}

+ 68 - 0
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 {
+
+    //默认为admin用户及拥有Sensitive权限字符用户不做脱敏
+    //1.配置菜单加入权限字符为Sensitive的按钮
+    //2.配置需要免除数据脱敏的角色加入Sensitive权限
+    //3.实体类上加上数据脱敏注解
+    /**
+     * 测试数据脱敏
+     */
+    @ApiOperation("查询测试单表列表")
+    @GetMapping()
+    public AjaxResult<TestSensitive> get() {
+        TestSensitive testSensitive = new TestSensitive()
+            .setIdCard("3333199910101212")
+            .setPhone("18888888888")
+            .setAddress("北京市朝阳区某某四合院1203室");
+        return AjaxResult.success(testSensitive);
+    }
+
+}

+ 35 - 0
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;
+}