数据脱敏 注解实现

在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作:

  1. 用户id
  2. 中文姓名
  3. 身份证号
  4. 座机号
  5. 手机号
  6. 地址
  7. 电子邮件
  8. 密码
  9. 中国大陆车牌,包含普通车辆、新能源车辆
  10. 银行卡

 

不得不提到hutool工具包,信息脱敏工具-DesensitizedUtil 

在项目的pom.xml的dependencies中加入以下内容:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.20</version>
</dependency>

  

Gradle

implementation 'cn.hutool:hutool-all:5.7.20'

  

使用方式:(更详细的方式请参照hutool官网)

// 5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);

// 180****1999
DesensitizedUtil.mobilePhone("18049531999");

// **********
DesensitizedUtil.password("1234567890");

  

 

有没有一种注解的使用方式可以直接在字段上使用呢?

答案是有的那就是 MyBatis - Plus 发布团队的新作:mybatis-mate 可惜的是企业级的需要收费,但是这面还是贴下maven坐标

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-mate-starter</artifactId>
            <version>1.0.16</version>
        </dependency>


        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-mate-annotation</artifactId>
            <version>1.0.16</version>
        </dependency>

  

属性 @FieldSensitive 注解即可自动按照预设策略对源数据进行脱敏处理,默认 SensitiveType 内置 9 种常用脱敏策略。例如:中文名、银行卡账号、手机号码、固话号码、邮寄地址、电子邮箱、身份证号码、密码、车牌号 脱敏策略,也可以自定义策略如下:

@FieldSensitive(type = "testStrategy")
private String username;

@FieldSensitive(type = SensitiveType.mobile)
private String mobile;

  

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(
using = SensitiveInfoSerialize.class
)
public @interface FieldSensitive {
String type();
}

 

通过查看注解发现是@JsonSerialize 加载了自己实现的转化 

 

 

所以我们可以仿照该注解自定义一个脱敏注解

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

    SensitiveStrategy strategy();
}

  

public enum SensitiveStrategy {

    //使用hutool工具包 提供的方法 也可以自己使用正则来替换
    ID_CARD(s -> DesensitizedUtil.idCardNum(s,3,6)),


    private final Function<String, String> desensitizer;

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

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

  

自定义序列化类:

public class SensitiveJsonSerializer  extends JsonSerializer<String> implements ContextualSerializer {
    private SensitiveStrategy strategy;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(strategy.desensitizer().apply(value));
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {

        FieldSensitive annotation = property.getAnnotation(FieldSensitive.class);
        if (Objects.nonNull(annotation)&&Objects.equals(String.class, property.getType().getRawClass())) {
            this.strategy = annotation.strategy();
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);

    }
}

  

 

在我们需要脱敏的实体类字段上加上我们自己定义的注解:

查看一下效果

 

 

 

正是我们所需要的效果!可以自己拓展其他的脱敏类型!! 

 

如果你喜欢就给我点个赞吧!!

 

posted @ 2022-02-08 13:22  18岁的俊后生  阅读(736)  评论(0编辑  收藏  举报