ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestSensitive.java | ●●●●● 补丁 | 查看 | 原始文档 | 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; }