自定义注意实现敏感信息字段脱敏

欢迎并感谢浏览卢小龙的本篇文章

你好!亲爱的读者,本篇文章将主要记录本人在开发中使用自定义注解完成对用户个人信息中如手机号、身份中号等敏感信息的脱敏战士使用,方便自己的学习历程记录以及复习参考,若有言错之处,请各位给予指点.

1.使用场景

在实际的开发任务中,页面上呈现的客户信息中携带者客户的手机号、证件号、实际姓名等诸多敏感类信息,这些敏感类信息应该进行脱敏展示,而无论是在SQL中使用脱敏还是在代码中利用Util工具类去实现脱敏,都非常的定制化。于是笔者使用自定义注解,只需要在VO中对字段打上注解即可完成脱敏。

2.实际使用

2.1 开发注解

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.haiercash.custservice.common.constant.enums.SensitiveStrategyEnum;
import com.haiercash.custservice.common.support.SensitiveJsonSerializer;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/************************************************
 * @Description: 敏感信息字段脱敏注解
 * @Author: xiaolong
 * @Date: 2022/11/29
 *************************************************/

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {

    SensitiveStrategyEnum strategy();
}

2.2 脱敏策略枚举

import java.util.function.Function;

/************************************************
 * @Description: 具体字段脱敏策略
 * @Author: xiaolong
 * @Date: 2022/11/29
 *************************************************/
public enum SensitiveStrategyEnum {

    USER_NAME(s -> s.replaceAll("(\\S)\\S(\\S)", "$1*$2")),

    CERT_NO(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),

    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));


    private final Function<String, String> desensitizer;

    SensitiveStrategyEnum(Function<String, String> desensitizer) {
        this.desensitizer = desensitizer;
    }

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

2.3 序列化切面

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.haiercash.custservice.common.annotation.Sensitive;
import com.haiercash.custservice.common.constant.enums.SensitiveStrategyEnum;

import java.io.IOException;
import java.util.Objects;


/************************************************
 * @Description: 数据脱敏序列化
 * @Author: xiaolong
 * @Date: 2022/11/29
 *************************************************/

public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private SensitiveStrategyEnum sensitiveStrategy;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(sensitiveStrategy.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.sensitiveStrategy = annotation.strategy();
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);
    }
}

2.4 脱敏字段注解使用

/************************************************
 * @Description: 客户列表-返回参数
 * @Author: xiaolong
 * @Date: 2022/11/22
 *************************************************/
@Data
@Accessors(chain = true)
@ApiModel(value = "CustomerInfoListVO", description = "客户列表-返回参数")
public class CustomerInfoListVO implements Serializable {

    @ApiModelProperty(value = "客户编号", position = 1)
    private String custNo;

    @ApiModelProperty(value = "客户姓名", position = 2)
    private String custName;

    @ApiModelProperty(value = "性别", position = 3)
    private String gender;

    @ApiModelProperty(value = "手机号码", position = 4)
    @Sensitive(strategy = SensitiveStrategyEnum.PHONE)
    private String mobile;

    @ApiModelProperty(value = "证件号", position = 5)
    @Sensitive(strategy = SensitiveStrategyEnum.CERT_NO)
    private String certNo;

    @ApiModelProperty(value = "客户状态", position = 6)
    private String isValid;

    @ApiModelProperty(value = "客户来源", position = 7)
    private String dataFrom;

    @ApiModelProperty(value = "注册id", position = 8)
    private String userId;

    @ApiModelProperty(value = "登录账号", position = 9)
    @Sensitive(strategy = SensitiveStrategyEnum.PHONE)
    private String login;

    @ApiModelProperty(value = "生日", position = 10)
    private String birthDt;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A请叫我卢老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值