数据脱敏 注解实现
在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作:
- 用户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); } }
在我们需要脱敏的实体类字段上加上我们自己定义的注解:
查看一下效果
正是我们所需要的效果!可以自己拓展其他的脱敏类型!!
如果你喜欢就给我点个赞吧!!