数据脱敏 注解实现
在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作:
- 用户id
- 中文姓名
- 身份证号
- 座机号
- 手机号
- 地址
- 电子邮件
- 密码
- 中国大陆车牌,包含普通车辆、新能源车辆
- 银行卡
不得不提到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);
}
}
在我们需要脱敏的实体类字段上加上我们自己定义的注解:
查看一下效果

正是我们所需要的效果!可以自己拓展其他的脱敏类型!!
如果你喜欢就给我点个赞吧!!

浙公网安备 33010602011771号