一個注解搞定SpringBoot接口定制屬性加解密

前言

上個月公司另一個團隊做的新項目上線后大體上運行穩(wěn)定,但包括研發(fā)負責人在內(nèi)的兩個人在項目上線后立馬就跳槽了,然后又交接給了我這個「垃圾回收人員」。

本周甲方另一個廠家的監(jiān)控平臺掃描到我們這個項目某些接口的一些敏感信息沒有做加密,要求我們立馬處理。

檢查了一下發(fā)現(xiàn)還真是這樣,手機、身份證號什么的都沒脫敏,心里頓時一萬頭神獸在奔騰。

還好,我有長期應(yīng)對這類突發(fā)事情的經(jīng)驗,直接寫了一個自定義注解,然后在需要加解密的接口上加上,和前端一聯(lián)調(diào),歐克搞定,之后臉上保持沉重,但內(nèi)心淡定摸魚,好不瀟灑。

趁著摸魚的空閑,我把實現(xiàn)方法簡化后用最易懂的方式分享出來,大家可以收藏一下,哪天用得上可以撈出來瞅瞅,節(jié)省點思考的時間。


技術(shù)版本

111.png


實現(xiàn)過程

1、引入依賴

222.png


2、實體類

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

333.png

一個是保存用戶時的請求對象UserInfoReq

444.png

這樣,我們就可以分別來測試一下查詢接口返回對象敏感屬性加密的情況,和保存接口請求對象敏感屬性解密的情況了。


3、yml配置

這里,我們主要加上密鑰的自定義配置,便于靈活修改。

555.png


4、自定義注解

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

666.png


5、加解密工具類

加解密工具類我們使用了Hutool提供的AES加解密工具

這里注意兩點:

1)、工具類中獲取yml配置,要加上@component注解,然后給變量設(shè)置static,但set方法去掉static,@Value獲取放在set方法上即可,否則不會生效;

2)、構(gòu)建AES工具要放在@PostConstruct注解中,表示Spring容器初始化這個Bean之后加載的內(nèi)容,不這樣處理直接構(gòu)建的話會拋出空指針異常。

777.png


6、AOP切面

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

888.png


7、測試接口

首先,我們來測試一下查詢接口,針對返回對象的部分敏感屬性進行加密。

這里,我們設(shè)置reqPropsName={},表示不對請求參數(shù)做加解密操作,設(shè)置respPropsName={"phone"、"idCard"、"name"},表示對返回對象中的手機號、身份證號、姓名進行加密返回。

999.png

其次,我們來測試一下保存接口,針對請求對象的部分已加密屬性進行解密。

這里,我們設(shè)置reqPropsName={"phone"、"idCard"、"name"},表示對請求參數(shù)中的手機號、身份證號、姓名做解密操作,設(shè)置respPropsName={},表示對返回對象不做加密操作。

保存接口執(zhí)行后我們直接返回這個對象就行,看看是不是已經(jīng)解密了。

1010.png


8、效果

查詢接口返回對象加密效果

1111.png

保存接口請求對象解密效果

1112.png


總結(jié)

自定義注解可以實現(xiàn)的功能很多,比如之前給大家寫過的一篇防重復(fù)提交注解,重點是AOP的思想,寫法大體上都是固定的。

這里的加解密注解依然有局限性:

1)、只支持有明確公共返回對象的接口,比如這里的Result;

2)、只支持@RequestBody請求對象,其他諸如多個param參數(shù)、Map等形式都不支持,可以自行擴展;

雖然不完美,但大體上已經(jīng)夠用,因為大部分SpringBoot項目都是遵循規(guī)范的,都會定義公共的返回對象,絕大部分請求接口也都是@RequesetBody來接收的。

AOP切面的實現(xiàn)中,針對請求對象的類型也留下了口子,感興趣的小伙伴可以下載源碼自行擴展,拿來練習(xí)都是不錯的選擇。

源碼會在評論區(qū)中給出來哦~



原創(chuàng)文章純手打,覺得有一滴滴幫助就請舉手之勞點個收藏吧~

持續(xù)分享工作中的真實經(jīng)驗和心得體會,喜歡的話就點個關(guān)注吧~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容