前言
上個(gè)月公司另一個(gè)團(tuán)隊(duì)做的新項(xiàng)目上線后大體上運(yùn)行穩(wěn)定,但包括研發(fā)負(fù)責(zé)人在內(nèi)的兩個(gè)人在項(xiàng)目上線后立馬就跳槽了,然后又交接給了我這個(gè)「垃圾回收人員」。
本周甲方另一個(gè)廠家的監(jiān)控平臺(tái)掃描到我們這個(gè)項(xiàng)目某些接口的一些敏感信息沒有做加密,要求我們立馬處理。
檢查了一下發(fā)現(xiàn)還真是這樣,手機(jī)、身份證號(hào)什么的都沒脫敏,心里頓時(shí)一萬(wàn)頭神獸在奔騰。
還好,我有長(zhǎng)期應(yīng)對(duì)這類突發(fā)事情的經(jīng)驗(yàn),直接寫了一個(gè)自定義注解,然后在需要加解密的接口上加上,和前端一聯(lián)調(diào),歐克搞定,之后臉上保持沉重,但內(nèi)心淡定摸魚,好不瀟灑。
趁著摸魚的空閑,我把實(shí)現(xiàn)方法簡(jiǎn)化后用最易懂的方式分享出來(lái),大家可以收藏一下,哪天用得上可以撈出來(lái)瞅瞅,節(jié)省點(diǎn)思考的時(shí)間。
技術(shù)版本

實(shí)現(xiàn)過程
1、引入依賴

2、實(shí)體類
我們定義兩個(gè)實(shí)體類,一個(gè)是模擬查詢用戶信息時(shí)接口響應(yīng)返回的對(duì)象UserInfo。

一個(gè)是保存用戶時(shí)的請(qǐng)求對(duì)象UserInfoReq

這樣,我們就可以分別來(lái)測(cè)試一下查詢接口返回對(duì)象敏感屬性加密的情況,和保存接口請(qǐng)求對(duì)象敏感屬性解密的情況了。
3、yml配置
這里,我們主要加上密鑰的自定義配置,便于靈活修改。

4、自定義注解
這里,我們給注解定義了兩個(gè)參數(shù),分別是請(qǐng)求時(shí)要給哪些屬性解密,以及響應(yīng)時(shí)要給哪些屬性加密,并分別給了默認(rèn)值。

5、加解密工具類
加解密工具類我們使用了Hutool提供的AES加解密工具
這里注意兩點(diǎn):
1)、工具類中獲取yml配置,要加上@component注解,然后給變量設(shè)置static,但set方法去掉static,@Value獲取放在set方法上即可,否則不會(huì)生效;
2)、構(gòu)建AES工具要放在@PostConstruct注解中,表示Spring容器初始化這個(gè)Bean之后加載的內(nèi)容,不這樣處理直接構(gòu)建的話會(huì)拋出空指針異常。

6、AOP切面
這里是自定義注解的AOP切面類,也是具體實(shí)現(xiàn),核心思想還是利用Java的反射機(jī)制,其中的一些寫法大體都是固定的,可以適當(dāng)理解,不建議過分領(lǐng)悟,以免造成困擾。

7、測(cè)試接口
首先,我們來(lái)測(cè)試一下查詢接口,針對(duì)返回對(duì)象的部分敏感屬性進(jìn)行加密。
這里,我們?cè)O(shè)置reqPropsName={},表示不對(duì)請(qǐng)求參數(shù)做加解密操作,設(shè)置respPropsName={"phone"、"idCard"、"name"},表示對(duì)返回對(duì)象中的手機(jī)號(hào)、身份證號(hào)、姓名進(jìn)行加密返回。

其次,我們來(lái)測(cè)試一下保存接口,針對(duì)請(qǐng)求對(duì)象的部分已加密屬性進(jìn)行解密。
這里,我們?cè)O(shè)置reqPropsName={"phone"、"idCard"、"name"},表示對(duì)請(qǐng)求參數(shù)中的手機(jī)號(hào)、身份證號(hào)、姓名做解密操作,設(shè)置respPropsName={},表示對(duì)返回對(duì)象不做加密操作。
保存接口執(zhí)行后我們直接返回這個(gè)對(duì)象就行,看看是不是已經(jīng)解密了。

8、效果
查詢接口返回對(duì)象加密效果

保存接口請(qǐng)求對(duì)象解密效果

總結(jié)
自定義注解可以實(shí)現(xiàn)的功能很多,比如之前給大家寫過的一篇防重復(fù)提交注解,重點(diǎn)是AOP的思想,寫法大體上都是固定的。
這里的加解密注解依然有局限性:
1)、只支持有明確公共返回對(duì)象的接口,比如這里的Result;
2)、只支持@RequestBody請(qǐng)求對(duì)象,其他諸如多個(gè)param參數(shù)、Map等形式都不支持,可以自行擴(kuò)展;
雖然不完美,但大體上已經(jīng)夠用,因?yàn)榇蟛糠諷pringBoot項(xiàng)目都是遵循規(guī)范的,都會(huì)定義公共的返回對(duì)象,絕大部分請(qǐng)求接口也都是@RequesetBody來(lái)接收的。
AOP切面的實(shí)現(xiàn)中,針對(duì)請(qǐng)求對(duì)象的類型也留下了口子,感興趣的小伙伴可以下載源碼自行擴(kuò)展,拿來(lái)練習(xí)都是不錯(cuò)的選擇。
源碼會(huì)在評(píng)論區(qū)中給出來(lái)哦~
原創(chuàng)文章純手打,覺得有一滴滴幫助就請(qǐng)舉手之勞點(diǎn)個(gè)贊和收藏吧~
持續(xù)分享工作中的真實(shí)經(jīng)驗(yàn)和心得體會(huì),喜歡的話就點(diǎn)個(gè)關(guān)注吧~