一個(gè)注解搞定SpringBoot接口定制屬性加解密

前言

上個(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ù)版本

111.png


實(shí)現(xiàn)過程

1、引入依賴

222.png


2、實(shí)體類

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

333.png

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

444.png

這樣,我們就可以分別來(lái)測(cè)試一下查詢接口返回對(duì)象敏感屬性加密的情況,和保存接口請(qǐng)求對(duì)象敏感屬性解密的情況了。


3、yml配置

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

555.png


4、自定義注解

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

666.png


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ì)拋出空指針異常。

777.png


6、AOP切面

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

888.png


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)行加密返回。

999.png

其次,我們來(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)解密了。

1010.png


8、效果

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

1111.png

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

1112.png


總結(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)注吧~

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

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

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