大家好,我是陈老师~通常接口返回值中的一些敏感数据也需要脱敏,比如身份证号,手机号,地址....通常的方法是用*来隐藏部分数据。当然,也可以根据您的需要进行定制。言归正传,如何优雅地实现呢?实现方案有两种,如下:集成Mybatis插件,查询时对特定字段进行脱敏集成Jackson,在序列化阶段对特定字段进行脱敏基于ShardingSphere实现数据脱敏第一种方案网上有很多实现方式,下面演示第二种方式,集成Jackson。1、自定义一个Jackson注解,需要自定义一个脱敏注解。一旦标记了一个属性,就会进行相应的脱敏,如下:using=SensitiveJsonSerializer.class)public@interfaceSensitive{//敏感策略SensitiveStrategystrategy();}2.自定义脱敏策略根据项目需求,自定义不同字段的脱敏规则,比如手机号中间数字被替换by*,如下:/***脱敏策略,枚举类,针对不同数据定制具体策略*/publicenumSensitiveStrategy{/***用户名*/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****"));privatefinalFunction脱敏剂;SensitiveStrategy(Functiondesensitizer){这个。脱敏剂=脱敏剂;}浦blicFunctiondesensitizer(){返回脱敏剂;}}以上只是提供的一部分,可以根据自己项目的需求进行配置3.自定义JSON序列化实现下面会是一个重要的实现,对注解@Sensitive标注的字段进行脱敏,实现如下:/***序列化注解的自定义实现*JsonSerializer:指定String类型,序列化()方法用于加载修改后的数据到*/publicclassSensitiveJsonSerializerextendsJsonSerializerimplementsContextualSerializer{privateSensitiveStrategystrategy;@Overridepublicvoidserialize(Stringvalue,JsonGeneratorgen,SerializerProviderserializers)throwsStringIOExatewritey{.desensitizer().apply(value));}/***获取属性上的注解属性*/@OverridepublicJsonSerializer>createContextual(SerializerProviderprov,BeanPropertyproperty)throwsJsonMappingException{Sensitiveannotation=property.getAnnotation(Sensitive.class);if(Objects.nonNull(annotation)&&Objects.equals(String.class,property.getType().getRawClass())){this.strategy=annotation.strategy();归还这个;}返回prov.findValueSerializer(property.getType(),属性);}}4。定义Person类,使用@Sensitive注解进行数据脱敏。代码如下:@DatapublicclassPerson{/***真实姓名*/@Sensitive(strategy=SensitiveStrategy.USERNAME)privateStringrealName;/***地址*/@Sensitive(strategy=SensitiveStrategy.ADDRESS)privateStringaddress;/***电话号码*/@Sensitive(strategy=SensitiveStrategy.PHONE)privateStringphoneNumber;/***身份证号码*/@Sensitive(strategy=SensitiveStrategy.ID_CARD)privateStringidCard;}5.模拟接口测试以上4步就完成了数据脱敏的Jackson注解,下面写一个controller进行测试。代码如下:@RestControllerpublicclassTestController{@GetMapping("/test")publicPersontest(){Personuser=newPerson();user.setRealName("不才陈");user.setPhoneNumber("19796328206");user.setAddress("浙江省杭州市....");user.setIdCard("4333333333334334333");返回用户;}}调用接口查看数据是否正常脱敏,结果如下:{"realName":"Not*Chen","address":"浙江省****city..****","phoneNumber":"197****8206","idCard":"4333****34333"}6.数据脱敏的总结方式有很多种,关键是哪个更合适,哪个更优雅.....