SpringBoot进阶SpringBoot如何对接口返回数
通常情况下,在我们开发一些数据敏感的项目的时候,需要对接口中的返回数据进行一个脱敏处理,例如在有些接口上会返回身份证号、手机号、家庭住址等信息,而对于这些数据的处理一般情况下我们会通过号来隐藏掉部分的关键数据。那么如何优雅的实现敏感数据的脱敏处理呢?如何优雅的实现接口数据脱敏操作?
第一步、需要定义一个用来进行数据脱敏的注解
我们通过注解的方式来定义哪些字段需要进行脱敏处理,被注解标注的字段就进行脱敏处理未被标记的字段就不需要进行脱敏处理。Retention(RetentionPolicy。RUNTIME)Target(ElementType。FIELD)JacksonAnnotationsInsideJsonSerialize(usingSensitiveJsonSerializer。class)publicinterfaceUnSensitive{SensitiveStrategystrategy();}
第二步、需要根据不同的字段,制定不同的脱敏策略publicenumSensitiveStrategy{对于用户名脱敏操作USERNAME(ss。replaceAll((S)S(S),12)),对用户身份证号进行脱敏IDCARD(ss。replaceAll((d{4})d{10}(w{4}),12)),对用户手机号进行脱敏PHONE(ss。replaceAll((d{3})d{4}(d{4}),12)),对地址进行脱敏ADDRESS(ss。replaceAll((S{3})S{2}(S)S{2},12));privatefinalFunctionString,Stringdesensitizer;SensitiveStrategy(FunctionString,Stringdesensitizer){this。desensitizerdesensitizer;}publicFunctionString,Stringdesensitizer(){returndesensitizer;}}
第三步、制定序列化实现方案
只要是添加UnSensitive注解的字段都进行脱敏处理publicclassSensitiveJsonSerializerextendsJsonSerializerStringimplementsContextualSerializer{privateSensitiveStrategysensitiveStrategy;Overridepublicvoidserialize(Strings,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{jsonGenerator。writeString(sensitiveStrategy。desensitizer()。apply(s));}OverridepublicJsonSerializerlt;?createContextual(SerializerProviderserializerProvider,BeanPropertybeanProperty)throwsJsonMappingException{UnSensitiveannotationbeanProperty。getAnnotation(UnSensitive。class);if(Objects。nonNull(annotation)Objects。equals(String。class,beanProperty。getType()。getRawClass())){this。sensitiveStrategyannotation。strategy();returnthis;}returnserializerProvider。findValueSerializer(beanProperty。getType(),beanProperty);}}测试脱敏效果
第一步、定义一个User的测试类并且加上对应的脱敏注解publicclassUser{UnSensitive(strategySensitiveStrategy。USERNAME)privateStringusername;UnSensitive(strategySensitiveStrategy。IDCARD)privateStringidcard;UnSensitive(strategySensitiveStrategy。PHONE)privateStringphone;UnSensitive(strategySensitiveStrategy。ADDRESS)privateStringaddress;settergetter代码被删除}
第二步、定义测试类调用RestControllerpublicclassTestController{GetMapping(test)publicUsergetUser(){UserusernewUser();user。setUsername(张无忌);user。setIdcard(214578859632145123);user。setPhone(18545678956);user。setAddress(武当山);returnuser;}}
测试结果如图所示。总结
在实际开发过程中,数据脱敏的方式有很多种,在开发过程中,可以根据自己的需求来选择合适的数据脱敏操作来完成对于关键信息的保护。