一個註解搞定SpringBoot介面訂製屬性加解密
前言
上個月公司另一個團隊做的新項目上線後大體上運行穩定,但包括研發負責人在內的兩個人在項目上線後立馬就跳槽了,然後又交接給了我這個「垃圾回收人員」。
本周甲方另一個廠家的監控平台掃描到我們這個項目某些介面的一些敏感資訊沒有做加密,要求我們立馬處理。
檢查了一下發現還真是這樣,手機、身份證號什麼的都沒脫敏,心裡頓時一萬頭神獸在奔騰。
還好,我有長期應對這類突發事情的經驗,直接寫了一個自定義註解,然後在需要加解密的介面上加上,和前端一聯調,歐克搞定,之後臉上保持沉重,但內心淡定摸魚,好不瀟洒。
趁著摸魚的空閑,我把實現方法簡化後用最易懂的方式分享出來,大家可以收藏一下,哪天用得上可以撈出來瞅瞅,節省點思考的時間。
技術版本
實現過程
1、引入依賴
2、實體類
我們定義兩個實體類,一個是模擬查詢用戶資訊時介面響應返回的對象UserInfo。
一個是保存用戶時的請求對象UserInfoReq
這樣,我們就可以分別來測試一下查詢介面返回對象敏感屬性加密的情況,和保存介面請求對象敏感屬性解密的情況了。
3、yml配置
這裡,我們主要加上密鑰的自定義配置,便於靈活修改。
4、自定義註解
這裡,我們給註解定義了兩個參數,分別是請求時要給哪些屬性解密,以及響應時要給哪些屬性加密,並分別給了默認值。
5、加解密工具類
加解密工具類我們使用了Hutool提供的AES加解密工具
這裡注意兩點:
1)、工具類中獲取yml配置,要加上@component註解,然後給變數設置static,但set方法去掉static,@Value獲取放在set方法上即可,否則不會生效;
2)、構建AES工具要放在@PostConstruct註解中,表示Spring容器初始化這個Bean之後載入的內容,不這樣處理直接構建的話會拋出空指針異常。
6、AOP切面
這裡是自定義註解的AOP切面類,也是具體實現,核心思想還是利用Java的反射機制,其中的一些寫法大體都是固定的,可以適當理解,不建議過分領悟,以免造成困擾。
7、測試介面
首先,我們來測試一下查詢介面,針對返回對象的部分敏感屬性進行加密。
這裡,我們設置reqPropsName={},表示不對請求參數做加解密操作,設置respPropsName={“phone”、”idCard”、”name”},表示對返回對象中的手機號、身份證號、姓名進行加密返回。
其次,我們來測試一下保存介面,針對請求對象的部分已加密屬性進行解密。
這裡,我們設置reqPropsName={“phone”、”idCard”、”name”},表示對請求參數中的手機號、身份證號、姓名做解密操作,設置respPropsName={},表示對返回對象不做加密操作。
保存介面執行後我們直接返回這個對象就行,看看是不是已經解密了。
8、效果
查詢介面返回對象加密效果
保存介面請求對象解密效果
總結
自定義註解可以實現的功能很多,比如之前給大家寫過的一篇防重複提交註解,重點是AOP的思想,寫法大體上都是固定的。
這裡的加解密註解依然有局限性:
1)、只支援有明確公共返回對象的介面,比如這裡的Result;
2)、只支援@RequestBody請求對象,其他諸如多個param參數、Map等形式都不支援,可以自行擴展;
雖然不完美,但大體上已經夠用,因為大部分SpringBoot項目都是遵循規範的,都會定義公共的返回對象,絕大部分請求介面也都是@RequesetBody來接收的。
AOP切面的實現中,針對請求對象的類型也留下了口子,感興趣的小夥伴可以下載源碼自行擴展,拿來練習都是不錯的選擇。
源碼會在評論區中給出來哦~
原創文章純手打,覺得有一滴滴幫助就請舉手之勞點個推薦吧~
持續分享工作中的真實經驗和心得體會,喜歡的話就點個關注吧~