利用Jackson序列化实现数据脱敏
几天前使用了Jackson对数据的自定义序列化。突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录。核心思想是利用Jackson的StdSerializer,JsonSerialize,以及自己实现的数据脱敏过程。
使用效果如下:首先在需要进行脱敏的VO字段上面标注相关脱敏注解
调用接口即可看到脱敏效果
实现过程如下:1。定义脱敏的过程实现CreatedbyEalenXieon202192415:52顶级的脱敏器publicinterfaceDesensitizationT{脱敏实现paramtarget脱敏对象return脱敏返回结果Tdesensitize(Ttarget);}
比如具体的手机号脱敏器实现importcom。github。Symbol;importjava。util。regex。Matcher;importjava。util。regex。Pattern;CreatedbyEalenXieon202192415:56手机号脱敏器默认只保留前3位和后4位publicclassPhoneDesensitizationimplementsStringDesensitization{手机号正则privatestaticfinalPatternDEFAULTPATTERNPattern。compile((13〔09〕14〔579〕15〔03,59〕16〔6〕17〔0135678〕18〔09〕19〔89〕)d{8});手机号脱敏只保留前3位和后4位OverridepublicStringdesensitize(Stringtarget){MatchermatcherDEFAULTPATTERN。matcher(target);while(matcher。find()){Stringgroupmatcher。group();targettarget。replace(group,group。substring(0,3)Symbol。getSymbol(4,Symbol。STAR)group。substring(7,11));}returntarget;}}2。定义脱敏注解,并指明了使用的序列化器,注解中声明了使用的脱敏器实现packagecom。github。annotation;importcom。fasterxml。jackson。annotation。JacksonAnnotationsInside;importcom。fasterxml。jackson。databind。annotation。JsonSerialize;importcom。github。desensitization。Desensitization;importcom。github。serializer。ObjectDesensitizeSerializer;importjava。lang。annotation。;CreatedbyEalenXieon202110811:30Target({ElementType。FIELD,ElementType。ANNOTATIONTYPE})Retention(RetentionPolicy。RUNTIME)JacksonAnnotationsInsideJsonSerialize(usingObjectDesensitizeSerializer。class)DocumentedpublicinterfaceDesensitize{脱敏器实现SuppressWarnings(all)Classlt;?extendsDesensitizationlt;?desensitization();}3。实现定义的序列化器importcom。fasterxml。jackson。core。JsonGenerator;importcom。fasterxml。jackson。databind。BeanProperty;importcom。fasterxml。jackson。databind。JsonSerializer;importcom。fasterxml。jackson。databind。SerializerProvider;importcom。fasterxml。jackson。databind。ser。ContextualSerializer;importcom。fasterxml。jackson。databind。ser。std。StdSerializer;importcom。github。Symbol;importcom。github。annotation。Desensitize;importcom。github。desensitization。Desensitization;importcom。github。desensitization。DesensitizationFactory;importcom。github。desensitization。StringDesensitization;importjava。io。IOException;CreatedbyEalenXieon2021899:03脱敏序列化器publicclassObjectDesensitizeSerializerextendsStdSerializerObjectimplementsContextualSerializer{privatetransientDesensitizationObjectdesensitization;protectedObjectDesensitizeSerializer(){super(Object。class);}publicDesensitizationObjectgetDesensitization(){returndesensitization;}publicvoidsetDesensitization(DesensitizationObjectdesensitization){this。desensitizationdesensitization;}OverridepublicJsonSerializerObjectcreateContextual(SerializerProviderprov,BeanPropertyproperty){Desensitizeannotationproperty。getAnnotation(Desensitize。class);returncreateContextual(annotation。desensitization());}SuppressWarnings(unchecked)publicJsonSerializerObjectcreateContextual(Classlt;?extendsDesensitizationlt;?clazz){ObjectDesensitizeSerializerserializernewObjectDesensitizeSerializer();if(clazz!StringDesensitization。class){serializer。setDesensitization((DesensitizationObject)DesensitizationFactory。getDesensitization(clazz));}returnserializer;}Overridepublicvoidserialize(Objectvalue,JsonGeneratorgen,SerializerProviderprovider)throwsIOException{DesensitizationObjectobjectDesensitizationgetDesensitization();if(objectDesensitization!null){try{gen。writeObject(objectDesensitization。desensitize(value));}catch(Exceptione){gen。writeObject(value);}}elseif(valueinstanceofString){gen。writeString(Symbol。getSymbol(((String)value)。length(),Symbol。STAR));}else{gen。writeObject(value);}}}4。代码的设计说明
完整代码可见:github。comEalenXieja另附基于Logback的日志脱敏方案(笔者认为这可能是全网最简单快捷的)
原理是利用Logback的自定义日志转换器ClassicConverter1。自定义脱敏日志转换器importch。qos。logback。classic。pattern。ClassicConverter;importch。qos。logback。classic。spi。ILoggingEvent;importcom。github。desensitization。EmailDesensitization;importcom。github。desensitization。IDCardDesensitization;importcom。github。desensitization。PhoneDesensitization;importcom。github。desensitization。StringDesensitization;importjava。util。ArrayList;importjava。util。List;authorEalenXiecreateon202131810:07此Converter提供支持日志脱敏1。编写此LogbackDesensitizeConverter2。正则脱敏手机号邮箱身份证publicclassLogbackDesensitizeConverterextendsClassicConverter{protectedstaticfinalListStringDesensitizationDESENSITIZATIONLISTnewArrayList();static{手机号脱敏DESENSITIZATIONLIST。add(newPhoneDesensitization());邮箱脱敏DESENSITIZATIONLIST。add(newEmailDesensitization());身份证脱敏DESENSITIZATIONLIST。add(newIDCardDesensitization());}OverridepublicStringconvert(ILoggingEventevent){Stringcontentevent。getMessage();try{for(StringDesensitizationdesensitization:DESENSITIZATIONLIST){contentdesensitization。desensitize(content);}}catch(Exceptione){ig}returncontent;}}2。启动类为PatternLayout的静态变量defaultConverterMap新增此自定义转换器importch。qos。logback。classic。PatternLayout;importcom。github。filter。LogbackDesensitizeConverter;importorg。springframework。boot。SpringApplication;importorg。springframework。boot。autoconfigure。SpringBootApplication;importorg。springframework。cloud。client。discovery。EnableDiscoveryClient;authorEalenXiecreateon2020112414:16EnableDiscoveryClientSpringBootApplicationpublicclassApiGatewayApplication{publicstaticvoidmain(String〔〕args){日志处理方案新增一个Logback的日志脱敏转换器PatternLayout。defaultConverterMap。put(m,LogbackDesensitizeConverter。class。getName());SpringApplication。run(ApiGatewayApplication。class,args);}}
启动后可以看到日志脱敏效果。
作者:EalenXie
链接:https:juejin。cnpost7018055632209051684
小敏家徐正第几集出来,小敏家徐正是谁扮演小敏家说出很多人不清楚,可小敏家剧中徐正到底是第几集出来,很多网友就想去了解一下有关的故事,看小敏家把徐正的出场把剧情进行推动,后期能欣赏不错的情感故事给展现,但有的网友就不清……
开空调制冷车内有水是咋回事?啥原因?夏天当我们在开车时基本上都会选择开空调,你遇到这种情况吗?当开空调时驾驶室会有水。我都遇到过几个4S店维修人员给我们空调厂家打电话说空调漏水,也遇到过整车路试人员给我们反馈开空……
飞利浦首次探讨智能远程会议的全局构架解决方案截止至2017年末,我国企业单位数量便已接近两千万,对比我国十四亿人口,就相当于每77人就对应一家企业。然而,在这庞大数据里的企业中,仍旧使用传统会议模式的企业比比皆是,但这种……
对手李小满男朋友,对手李小满扮演者对手说出来很多人不清楚,可对手剧情中李小满的男朋友是谁,很多网友就想去了解一下有关的故事,看对手剧情刚开始没有多久展现出李小满的男朋友,并她把学生的情况演特别像,但有的网友就不……
鹤唳华亭太子妃流产怎么回事是陆文昔害太子妃流产的吗《鹤唳华亭》又更新了,在最新更新的剧情当中,太子妃张念之流产了,这是怎么回事呢?萧定权要处死陆文昔,是因为陆文昔害太子妃流产的吗?一起来看一下具体的情况。《鹤唳华亭》前几……
蝙蝠侠为什么那么富,蝙蝠侠是个什么样的人蝙蝠侠说来很多人清楚,可他为什么那么富,很多网友就想去了解一下有关的故事,看他的家庭背景很好,而他的家中是一脉单传,让他能完全继承家中的资产,自然就变得富有,但有的网友就不清楚……
干皮最爱!8款超水润又不卡粉的粉底液,好用到炸相信每个化妆的人,大概都面临过这种社死情况:精心化了一两个小时的妆,结果出门不是卡粉,就是浮粉,难道这就是福分?于是,阿宝去整理了一些风评不错的宝藏干皮粉底,主要针……
猫女和蝙蝠侠结婚了吗,蝙蝠侠与猫女是哪部电影猫女和蝙蝠侠说出来很多人清楚,可他们结婚的疑问,很多网友就想去了解一下有关的故事,看他们进行结婚的事情早都进行,不过后期有人掺和进去,使得他们的婚姻就变得很不好,但有的网友就不……
神秘海域什么时候上映,神秘海域演员表神秘海域说出来很多人不清楚,可神秘海域电影是什么时候上映,很多网友就想去了解一下有关的故事,看神秘海域提前公布相关的海报和预告片,好让观众能知道大概演绎的剧情,但有的网友就不清……
预售16万起,最高续航600公里,小鹏P5或9月上市近日,我们从相关渠道获知,小鹏P5或将于今年9月份上市,此前新车已经公布了预售价,新车预售价为1623万元。续航方面,将提供460公里、550公里和最高600公里三种续航选择。……
1。3亿资金被冻结340家店铺遭封杀!中国卖家怎么了?作者任倩文编辑何洋【亿邦动力讯】又一个跨境电商大卖家摇摇欲坠。天泽信息产业股份有限公司(以下简称天泽信息)发布关于旗下主营跨境电商出口业务的控股子公司深圳市有棵树科……
刘烈宏任中国联通党组书记董事长据人民邮电报微信公众号消息,8月27日下午,中组部宣布任命,刘烈宏任中国联合网络通信集团有限公司党组书记、董事长,免去其工业和信息化部党组成员、副部长职务。刘烈宏简历……