我是靠谱客的博主 直率唇彩,这篇文章主要介绍自定义一个Jackson注解实现数据脱敏,现在分享给大家,希望可以做个参考。

需要自定义一个脱敏注解,一旦有属性被标注,则进行对应得脱敏,如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
/** * 自定义jackson注解,标注在属性上 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @JacksonAnnotationsInside @JsonSerialize(using = SensitiveJsonSerializer.class) public @interface Sensitive { //脱敏策略 SensitiveStrategy strategy(); }
  1. 定制脱敏策略
    针对项目需求,定制不同字段的脱敏规则,比如手机号中间几位用*替代,如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/** * 脱敏策略,枚举类,针对不同的数据定制特定的策略 */ public enum SensitiveStrategy { /** * 用户名 */ USERNAME(s -> s.replaceAll("(\S)\S(\S*)", "$1*$2")), /** * 身份证 */ ID_CARD(s -> s.replaceAll("(\d{4})\d{10}(\w{4})", "$1****$2")), /** * 手机号 */ PHONE(s -> s.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2")), /** * 地址 */ ADDRESS(s -> s.replaceAll("(\S{3})\S{2}(\S*)\S{2}", "$1****$2****")); private final Function<String, String> desensitizer; SensitiveStrategy(Function<String, String> desensitizer) { this.desensitizer = desensitizer; } public Function<String, String> desensitizer() { return desensitizer; } } 以上只是提供了部分,具体根据自己项目要求进行配置。
  1. 定制JSON序列化实现
    下面将是重要实现,对标注注解@Sensitive的字段进行脱敏,实现如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/** * 序列化注解自定义实现 * JsonSerializer<String>:指定String 类型,serialize()方法用于将修改后的数据载入 */ 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 { 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); } }
  1. 定义Person类,对其数据脱敏
    使用注解@Sensitive注解进行数据脱敏,代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Data public class Person { /** * 真实姓名 */ @Sensitive(strategy = SensitiveStrategy.USERNAME) private String realName; /** * 地址 */ @Sensitive(strategy = SensitiveStrategy.ADDRESS) private String address; /** * 电话号码 */ @Sensitive(strategy = SensitiveStrategy.PHONE) private String phoneNumber; /** * 身份证号码 */ @Sensitive(strategy = SensitiveStrategy.ID_CARD) private String idCard; }
  1. 模拟接口测试
    以上4个步骤完成了数据脱敏的Jackson注解,下面写个controller进行测试,代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController public class TestController { @GetMapping("/test") public Person test(){ Person user = new Person(); user.setRealName("天天工作"); user.setPhoneNumber("19796328206"); user.setAddress("浙江省杭州市...."); user.setIdCard("4333333333334334333"); return user; } }

调用接口查看数据有没有正常脱敏,结果如下:

复制代码
1
2
3
4
5
6
7
{ "realName": "天*工作", "address": "浙江省****市..****", "phoneNumber": "197****8206", "idCard": "4333****34333" }

最后

以上就是直率唇彩最近收集整理的关于自定义一个Jackson注解实现数据脱敏的全部内容,更多相关自定义一个Jackson注解实现数据脱敏内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部