liuhy il y a 2 ans
Parent
commit
5dbc3a9274

+ 35 - 0
tnc-sms/src/main/java/org/jeecg/modules/smscheck/annotation/Desensitization.java

@@ -0,0 +1,35 @@
+package org.jeecg.modules.smscheck.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.jeecg.modules.smscheck.enums.DesensitizationTypeEnum;
+import org.jeecg.modules.smscheck.serialize.DesensitizationSerialize;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @description: 数据脱敏注解
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@JacksonAnnotationsInside
+@JsonSerialize(using = DesensitizationSerialize.class)
+public @interface Desensitization {
+    /**
+     * 脱敏数据类型,只要在CUSTOMER的时候,startInclude和endExclude生效
+     */
+    DesensitizationTypeEnum type() default DesensitizationTypeEnum.CUSTOMER;
+
+    /**
+     * 开始位置(包含)
+     */
+    int startInclude() default 0;
+
+    /**
+     * 结束位置(不包含)
+     */
+    int endExclude() default 0;
+}

+ 25 - 0
tnc-sms/src/main/java/org/jeecg/modules/smscheck/controller/DesensitizationTest.java

@@ -0,0 +1,25 @@
+package org.jeecg.modules.smscheck.controller;
+
+import org.jeecg.modules.smscheck.entity.BusinessReminderCard;
+import org.jeecg.modules.smscheck.service.BusinessReminderCardService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("/desensitization")
+public class DesensitizationTest {
+    @Resource
+    BusinessReminderCardService businessReminderCardService;
+
+    @GetMapping(value ="/test")
+    public List<BusinessReminderCard> test(){
+        List<BusinessReminderCard> list = businessReminderCardService.list();
+        BusinessReminderCard businessReminderCard = new BusinessReminderCard();
+        businessReminderCard.setPhone("121212323232323");
+        return list;
+    }
+}

+ 5 - 0
tnc-sms/src/main/java/org/jeecg/modules/smscheck/entity/BusinessReminderCard.java

@@ -9,6 +9,8 @@ import io.swagger.models.auth.In;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.modules.smscheck.annotation.Desensitization;
+import org.jeecg.modules.smscheck.enums.DesensitizationTypeEnum;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.util.Date;
@@ -26,10 +28,13 @@ public class BusinessReminderCard {
     /** 主键 */
     @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "主键")
+    @Desensitization(type = DesensitizationTypeEnum.CHINESE_NAME)
     private String id;
     /** 联电归属地 */
     private String address;
     /** 拨测联系电话 */
+    // CUSTOMER 是自定义类型
+    @Desensitization(type = DesensitizationTypeEnum.CUSTOMER,startInclude = 5,endExclude = 10)
     private String phone;
     /** 拨测结果 */
     private String calltestResults;

+ 32 - 0
tnc-sms/src/main/java/org/jeecg/modules/smscheck/enums/DesensitizationTypeEnum.java

@@ -0,0 +1,32 @@
+package org.jeecg.modules.smscheck.enums;
+
+/**
+ * @Description 数据脱敏枚举
+ * @ClassName DesensitizedTypeEnum
+ **/
+public enum DesensitizationTypeEnum {
+    //自定义
+    CUSTOMER,
+
+    //用户id
+    USER_ID,
+    //中文名
+    CHINESE_NAME,
+    //身份证号
+    ID_CARD,
+    //座机号
+    FIXED_PHONE,
+    //手机号
+    MOBILE_PHONE,
+    //地址
+    ADDRESS,
+    //电子邮件
+    EMAIL,
+    //密码
+    PASSWORD,
+    //中国大陆车牌,包含普通车辆、新能源车辆
+    CAR_LICENSE,
+    //银行卡
+    BANK_CARD
+}
+

+ 106 - 0
tnc-sms/src/main/java/org/jeecg/modules/smscheck/serialize/DesensitizationSerialize.java

@@ -0,0 +1,106 @@
+package org.jeecg.modules.smscheck.serialize;
+
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.DesensitizedUtil;
+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 lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import org.jeecg.modules.smscheck.annotation.Desensitization;
+import org.jeecg.modules.smscheck.enums.DesensitizationTypeEnum;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * @Description 脱敏序列化
+ * @ClassName DesensitizedSerialize
+ **/
+@NoArgsConstructor
+@AllArgsConstructor
+public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {
+    private DesensitizationTypeEnum type;
+
+    private Integer startInclude;
+
+    private Integer endExclude;
+    @Override
+    public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        switch (type) {
+            // 自定义类型脱敏
+            case CUSTOMER:
+                jsonGenerator.writeString(CharSequenceUtil.hide(str,startInclude,endExclude));
+                break;
+            // userId脱敏
+            case USER_ID:
+                jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));
+                break;
+            // 中文姓名脱敏
+            case CHINESE_NAME:
+                jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));
+                break;
+            // 身份证脱敏
+            case ID_CARD:
+                jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str), 1, 2));
+                break;
+            // 固定电话脱敏
+            case FIXED_PHONE:
+                jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));
+                break;
+            // 手机号脱敏
+            case MOBILE_PHONE:
+                jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str)));
+                break;
+            // 地址脱敏
+            case ADDRESS:
+                jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str), 8));
+                break;
+            // 邮箱脱敏
+            case EMAIL:
+                jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str)));
+                break;
+            // 密码脱敏
+            case PASSWORD:
+                jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str)));
+                break;
+            // 中国车牌脱敏
+            case CAR_LICENSE:
+                jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str)));
+                break;
+            // 银行卡脱敏
+            case BANK_CARD:
+                jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str)));
+                break;
+            default:
+        }
+
+    }
+
+    @Override
+    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
+        if (beanProperty != null) {
+            // 判断数据类型是否为String类型
+            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
+                // 获取定义的注解
+                Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);
+                // 为null
+                if (desensitization == null) {
+                    desensitization = beanProperty.getContextAnnotation(Desensitization.class);
+                }
+                // 不为null
+                if (desensitization != null) {
+                    // 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。
+                    return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(),
+                            desensitization.endExclude());
+                }
+            }
+
+            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
+        }
+        return serializerProvider.findNullValueSerializer(null);
+    }
+}

+ 21 - 0
tnc-sms/src/main/java/org/jeecg/modules/smscheck/serialize/TestJacksonSerialize.java

@@ -0,0 +1,21 @@
+package org.jeecg.modules.smscheck.serialize;
+
+import cn.hutool.core.util.DesensitizedUtil;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import lombok.SneakyThrows;
+
+/**
+ * @Description 脱敏序列化
+ * @ClassName DesensitizedSerialize
+ **/
+public class TestJacksonSerialize extends JsonSerializer<String> {
+
+    @Override
+    @SneakyThrows
+    public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
+        // 使用我们的hutool工具类进行手机号脱敏
+        jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));
+    }
+}