Spring自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏
今天,我們將深入探討如何自定義注解來實(shí)現(xiàn)對敏感數(shù)據(jù)的脫敏處理。在當(dāng)今數(shù)據(jù)安全越來越受到重視的背景下,許多企業(yè)都對敏感數(shù)據(jù)的保護(hù)有著嚴(yán)格的要求,尤其是在處理涉及個(gè)人隱私、財(cái)務(wù)信息等敏感數(shù)據(jù)時(shí),脫敏成為了一個(gè)至關(guān)重要的環(huán)節(jié)。因此,今天的內(nèi)容將著重于實(shí)踐操作,而不會(huì)涉及過多的理論解析。
我們將通過一個(gè)具體的示例,逐步展示如何通過自定義注解來對數(shù)據(jù)進(jìn)行脫敏處理,整個(gè)過程僅依賴Spring框架,無需引入任何第三方庫或額外的依賴。只需要跟隨步驟操作,即可完成相應(yīng)的功能實(shí)現(xiàn)。接下來,讓我們開始這一實(shí)戰(zhàn)篇的學(xué)習(xí)吧。
數(shù)據(jù)脫敏
我們需要處理的脫敏數(shù)據(jù)種類繁多,包括但不限于身份證號(hào)碼、電話號(hào)碼、用戶名、微信號(hào)等。每種數(shù)據(jù)類型都有其特定的加密或脫敏規(guī)則,因此必須對每種數(shù)據(jù)類型進(jìn)行單獨(dú)處理。
自定義注解
接下來,我們將需要使用自定義注解來實(shí)現(xiàn)特定的功能和行為。這些注解將根據(jù)其定義的用途,分別作用于各個(gè)類的屬性上,以便在不同的上下文中提供所需的標(biāo)識(shí)、驗(yàn)證或處理邏輯。好的,我們編寫一下:
public class DesensitizeJsonSerializerByTelNo extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 在序列化時(shí)進(jìn)行數(shù)據(jù)脫敏 gen.writeString(value.replaceAll("(?<=^..).(?=.*..$)", "*")); } } public class DesensitizeJsonSerializerByCustNm extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 在序列化時(shí)進(jìn)行數(shù)據(jù)脫敏 gen.writeString(value.replaceAll("(?<=^.).*", "*")); } } public class DesensitizeJsonSerializerByEmail extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 在序列化時(shí)進(jìn)行數(shù)據(jù)脫敏 gen.writeString(value.replaceAll("(?<=^.|(?<=@.).)([^@])(.*)(?=@|$)", "*$3")); } }
在這里,我們不打算列舉所有可能的注解,而是選擇列舉三個(gè)最常用、最具代表性的注解類型。這些注解覆蓋了我們在實(shí)際開發(fā)中最常見的需求。接下來,我們就開始在具體的類和屬性上添加這些注解。
用法
我們通常會(huì)使用實(shí)體類來作為返回?cái)?shù)據(jù)類型傳遞給Spring框架,Spring會(huì)自動(dòng)將這些實(shí)體類進(jìn)行序列化,以便在客戶端和服務(wù)器之間進(jìn)行數(shù)據(jù)交換。接下來,我們就開始具體實(shí)現(xiàn)這一過程。
@JsonSerialize(using = DesensitizeJsonSerializerByCustNm.class) private String custNm; @JsonSerialize(using = DesensitizeJsonSerializerByIdentityCard.class) private String ssnCrnNo;
在這里,我們僅演示基本的脫敏用法。這種方式基本上能夠確保在返回給前端時(shí),數(shù)據(jù)會(huì)經(jīng)過注解標(biāo)記的序列化脫敏處理,從而避免敏感信息泄露。然而,如果我們需要在內(nèi)部處理過程中也對數(shù)據(jù)進(jìn)行脫敏,該怎么辦呢?因?yàn)槟J(rèn)情況下,脫敏操作僅會(huì)在數(shù)據(jù)返回給前端時(shí)通過注解觸發(fā),而在內(nèi)部邏輯中,數(shù)據(jù)并不會(huì)自動(dòng)脫敏。
在這種情況下,我們可以使用 ObjectMapper
來手動(dòng)對對象進(jìn)行脫敏操作,確保在內(nèi)部使用時(shí)也能達(dá)到相同的脫敏效果。
內(nèi)部脫敏
接下來,在這個(gè)示例中,我們會(huì)演示如何通過脫敏處理來保護(hù)敏感信息的隱私。以下是具體的代碼實(shí)現(xiàn):
List<ResultInfoVO> list = selectResultByCondition(searchVO); ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writeValueAsString(list); list = objectMapper.readValue(s, new com.fasterxml.jackson.core.type.TypeReference<List<ResultInfoVO>>() {});
“通過這種方式,數(shù)據(jù)會(huì)自動(dòng)進(jìn)行脫敏處理。實(shí)際上,整個(gè)過程只是通過序列化將對象轉(zhuǎn)換成可傳輸?shù)母袷?,再?jīng)過反序列化恢復(fù)成原始對象的過程。
總結(jié)
在數(shù)據(jù)安全日益重要的今天,敏感數(shù)據(jù)的脫敏處理顯得尤為關(guān)鍵,尤其是在涉及個(gè)人隱私和財(cái)務(wù)信息時(shí)。本文探討了如何通過自定義注解,在不引入第三方庫的情況下,使用Spring框架進(jìn)行數(shù)據(jù)脫敏處理。我們通過具體的示例展示了如何為常見的敏感數(shù)據(jù)類型(如電話號(hào)碼、身份證、電子郵件等)編寫自定義注解,并在序列化過程中應(yīng)用脫敏規(guī)則。通過這些注解,敏感信息可以在數(shù)據(jù)返回前端時(shí)自動(dòng)進(jìn)行脫敏,避免泄露。
到此這篇關(guān)于Spring自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏的文章就介紹到這了,更多相關(guān)Spring數(shù)據(jù)脫敏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?中很好用的數(shù)據(jù)結(jié)構(gòu)(你絕對沒用過)
今天跟大家介紹的就是?java.util.EnumMap,也是?java.util?包下面的一個(gè)集合類,同樣的也有對應(yīng)的的?java.util.EnumSet,對java數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05Jackson處理Optional時(shí)遇到問題的解決與分析
Optional是Java實(shí)現(xiàn)函數(shù)式編程的強(qiáng)勁一步,并且?guī)椭诜妒街袑?shí)現(xiàn),但是Optional的意義顯然不止于此,下面這篇文章主要給大家介紹了關(guān)于Jackson處理Optional時(shí)遇到問題的解決與分析的相關(guān)資料,需要的朋友可以參考下2022-02-02將ResultSet中得到的一行或多行結(jié)果集封裝成對象的實(shí)例
這篇文章主要介紹了將ResultSet中得到的一行或多行結(jié)果集封裝成對象的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05mybatis中如何傳遞單個(gè)String類型的參數(shù)
這篇文章主要介紹了mybatis中如何傳遞單個(gè)String類型的參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11如何解決executors線程池創(chuàng)建的線程不釋放的問題
這篇文章主要介紹了如何解決executors線程池創(chuàng)建的線程不釋放的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08MyBatis-Plus自定義SQL和復(fù)雜查詢的實(shí)現(xiàn)
MyBatis-Plus增強(qiáng)了MyBatis的功能,提供注解和XML兩種自定義SQL方式,支持復(fù)雜查詢?nèi)缍啾黻P(guān)聯(lián)、動(dòng)態(tài)分頁等,通過注解如@Select、@Insert、@Update、@Delete實(shí)現(xiàn)CRUD操作,本文就來介紹一下,感興趣的可以了解一下2024-10-10