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