SpringBoot 脱敏实现

借助hutool工具 大概是5.7.14版本以上 不然没有脱敏工具类

自定义注解

主要是以这两个注解

@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)在实体类序列化时实现脱敏效果
/**
 * 数据脱敏注解
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
    SensitiveStrategy strategy();
}

脱敏策略:


import cn.hutool.core.util.DesensitizedUtil;
import lombok.AllArgsConstructor;

import java.util.function.Function;

/**
 * 脱敏策略
 *
 */
@AllArgsConstructor
public enum SensitiveStrategy {

    /**
     * 身份证脱敏
     */
    ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)),

    /**
     * 手机号脱敏
     */
    PHONE(DesensitizedUtil::mobilePhone),

    /**
     * 地址脱敏
     */
    ADDRESS(s -> DesensitizedUtil.address(s, 8)),

    /**
     * 邮箱脱敏
     */
    EMAIL(DesensitizedUtil::email),

    /**
     * 银行卡
     */
    BANK_CARD(DesensitizedUtil::bankCard),

    /**
     * 微信号
     */
//    WECHAT(DesensitizedUtils::weChat),

    ;

    //可自行添加其他脱敏策略

    private final Function<String, String> desensitizer;

    public Function<String, String> desensitizer() {
        return desensitizer;
    }
}

脱敏序列化


import com.example.sugg.demo.aopi.Sensitive;
import com.example.sugg.demo.enumi.SensitiveStrategy;
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 java.io.IOException;
import java.util.Objects;

/**
 * 数据脱敏json序列化工具
 *
 */
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private SensitiveStrategy strategy;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        //   SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class);
        //  这里可以根据业务对不同的角色做脱敏
        //  if (sensitiveService.isSensitive()) {
        //    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);
    }
}

测试

@GetMapping("/insert")
    public TestSensitive insert(){
//        return userService.insert(user);
       return TestSensitive.builder().idCard("1234241223123123")
                .phone("13068943552")
                .email("zhangli@163.com").build();

    }
    

// 实体类
    @Builder
    @Data
    static class TestSensitive {
    /**
     * 身份证
     */
    @Sensitive(strategy = SensitiveStrategy.ID_CARD)
    private String idCard;
    /**
     * 电话
     */
    @Sensitive(strategy = SensitiveStrategy.PHONE)
    private String phone;
    /**
     * 邮箱
     */
    @Sensitive(strategy = SensitiveStrategy.EMAIL)
    private String email;
}

/**
效果

{
    "idCard": "123*********3123",
    "phone": "130****3552",
    "email": "y***********@163.com"
}

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值