!127 add 新增数据脱敏注解,可根据菜单权限字符控制是否脱敏
Merge pull request !127 from Yjoioooo/auto-5403234-dev-1640272112776
已添加5个文件
201 ■■■■■ 文件已修改
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestSensitive.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
}
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;
    }
}
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);
    }
}
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);
    }
}
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;
}