思君令人老,岁月忽已晚。
1 前言
前文中已经讲解了使用 RSA
加密返回数据报文的分享,但是在某些情况下,需要加密的不是整个报文,而是报文中的某些字段,比如涉及到个人信息,身份证、姓名和手机号等信息,这些是需要进行加密返回,在经过授权或者认证之后才能经过解密展示全文。此外,在显示金额字段时,还可能对数据进行脱敏处理,这些都需要用到今天分析的内容,如何加密或者脱敏返回某些特定的字段。
2 实现分析
首先我们需要先明晰一下具体的需求,如下图所示,对个人信息比如姓名、邮箱、手机号、身份证等信息进行脱敏,只展示一部分的信息。
那么怎么能实现这个脱敏或者加密呢,写一个工具类,对每个返回的数据内容遍历并处理需要脱敏或者加密的字段呢,显然这个工作量很大,而且容易遗漏,如果变动其脱敏方法也很困难,这个需求和业务耦合度很高,所以这种方式非常的不推荐。
这里推荐的是一个 AOP
的做法,实现业务和脱敏需求的剥离, AOP
大家都很熟悉,面向切面编程,其实处理脱敏或者加密也是在方法返回之前进行处理,这个做法的非常推荐的,但是我们要怎么处理具体的脱敏字段呢,这就用到了 java
中的注解,通常我们使用注解是在方法上,诸如实现业务日志的记录,我们可以自定义注解,加在需要脱敏或者加密的返回类的属性上,这样在切面中拦截注解,根据其特征来处理脱敏或者加密。
3 代码分析
如上所述,我们需要定义一个注解,用于标记需要脱敏或者加密的属性,如下所示:
那么如何能够拦截到方法的返回值呢,这里需要用到 HandlerMethodReturnValueHandler
,这是spring
中的一个 Handler
, 可以捕获控制器层方法的返回值,具体做法如下图所示:
由于返回值的类型不统一,需要考虑各种可能性,最终通过判断来获取返回实体类,针对具体的返回实体进行处理。
获取到具体的实体类后,需要获取实体的每个字段,通过判断是否含有脱敏注解来进一步处理。默认情况下,需要按照脱敏来处理,根据试题配置的脱敏规则来处理字段值的脱敏。如果需要加密,则使用 DES
的对称加密来实现。
完成以上的配置后,还需要将该配置放入 spring
上下文中,如下图所示:
4 结果展示
完成以上的配置后,即可实现加密或者脱敏的功能,如下图所示:
使用注解的方式,可以很好的完成需求,同时也很方便调整脱敏的策略和加密方式,实现了业务和脱敏或者加密的分离,避免了重复的代码。
5 总结
在本文中,介绍了使用注解的方式完成返回值部分字段的加密和脱敏,这个技能点在日常的业务开发中会经常使用,尤其是在涉及个人信息的场景。还有一种方式是在通过 orm
框架读取数据时进行处理,但是此种方式可能会阻碍正常业务的开展,脱敏的数据可能无法正常判断,所以还是推荐在返回结果数据时进行脱敏或者加密处理。本文中所涉及的代码已经上传至 github
, 欢迎交流学习。项目地址 springboot-templet-start。