最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)接口返回數(shù)據(jù)脫敏的代碼示例

 更新時間:2024年07月10日 09:34:43   作者:詩筠  
在當(dāng)今的信息化時代,數(shù)據(jù)安全尤為重要,接口返回數(shù)據(jù)脫敏是一種重要的數(shù)據(jù)保護手段,可以防止敏感信息通過接口返回給客戶端,本文旨在探討如何在SpringBoot應(yīng)用程序中實現(xiàn)接口返回數(shù)據(jù)脫敏,需要的朋友可以參考下

引言

在當(dāng)今的信息化時代,數(shù)據(jù)安全尤為重要。接口返回數(shù)據(jù)脫敏是一種重要的數(shù)據(jù)保護手段,可以防止敏感信息通過接口返回給客戶端,降低數(shù)據(jù)泄露的風(fēng)險。本文旨在探討如何在SpringBoot應(yīng)用程序中實現(xiàn)接口返回數(shù)據(jù)脫敏。我們將介紹一種基于自定義注解結(jié)合Hutool脫敏工具類的方案,以實現(xiàn)SpringBoot中的接口返回數(shù)據(jù)脫敏。

一、接口數(shù)據(jù)脫敏概述

1.1 接口數(shù)據(jù)脫敏的定義

接口數(shù)據(jù)脫敏是指在Web應(yīng)用程序的API接口返回數(shù)據(jù)時,對包含敏感信息的字段進行處理,使其部分或全部信息被隱藏或替換,以防止敏感信息的泄露。這個過程通常不會改變數(shù)據(jù)的原始格式,而是通過特定的算法或規(guī)則,將敏感部分替換為特定字符(如星號*)或者保留部分信息。

1.2 接口數(shù)據(jù)脫敏的重要性

數(shù)據(jù)脫敏的重要性主要體現(xiàn)在以下幾個方面:

  1. 保護用戶隱私: 對于姓名、身份證號、手機號等個人敏感信息進行脫敏,可以有效保護用戶隱私,防止信息被濫用。
  2. 遵守法律法規(guī): 許多國家和地區(qū)都制定了嚴(yán)格的數(shù)據(jù)保護法規(guī),如歐盟的GDPR和中國的《個人信息保護法》。實施數(shù)據(jù)脫敏有助于企業(yè)合規(guī)經(jīng)營。
  3. 降低安全風(fēng)險: 通過脫敏處理,即使數(shù)據(jù)不慎泄露,也能最大限度地減少敏感信息被盜用的風(fēng)險。
  4. 支持?jǐn)?shù)據(jù)共享: 在保護隱私的同時,脫敏數(shù)據(jù)仍然保留了一定的分析價值,有利于數(shù)據(jù)的安全共享和利用。

1.3 接口數(shù)據(jù)脫敏的實現(xiàn)方式

  1. 手動脫敏:在業(yè)務(wù)邏輯層直接對敏感數(shù)據(jù)進行處理。這種方式靈活但容易遺漏,且代碼重復(fù)率高。

  2. AOP(面向切面編程):通過切面攔截返回數(shù)據(jù),統(tǒng)一處理敏感字段。這種方式可以集中管理脫敏邏輯,但可能影響性能。

  3. 自定義序列化器:利用JSON序列化框架(如Jackson)的自定義序列化器來處理敏感字段。這種方式性能較好,且與業(yè)務(wù)邏輯解耦。

  4. 注解+反射:通過自定義注解標(biāo)記需要脫敏的字段,然后利用反射機制在運行時進行脫敏處理。這種方式使用簡單,易于維護。

本文將重點介紹如何結(jié)合自定義注解和Hutool工具類來實現(xiàn)接口數(shù)據(jù)脫敏。

二、開發(fā)環(huán)境

  • JDK版本:JDK 17
  • Spring Boot版本:Spring Boot 3.2.2
  • 構(gòu)建工具:Maven

三、實現(xiàn)接口返回數(shù)據(jù)脫敏

3.1 添加依賴

首先在 pom.xml 文件中添加必要的依賴:

    <!-- Hutool工具包 -->    
<dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.25</version>
    </dependency>
    <!-- Jackson依賴 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.2</version>
    </dependency>

3.2 創(chuàng)建自定義注解

接下來,我們創(chuàng)建一個自定義注解 @Desensitize

/**
 * 用于標(biāo)記字段需要進行脫敏處理的注解
 *
 * @author shijun
 * @date 2024/07/09
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizeSerializer.class)
public @interface Desensitize {

    /**
     * 脫敏類型
     */
    DesensitizeType type() default DesensitizeType.DEFAULT;

    /**
     * 脫敏起始位置
     */
    int startInclude() default 0;

    /**
     * 脫敏結(jié)束位置
     */
    int endExclude() default 0;
    
}

3.3 定義脫敏枚舉類

然后,定義枚舉類 DesensitizeType 來定義字段的脫敏類型:

/**
 * 脫敏類型枚舉類
 */
public enum DesensitizeType {

    /**
     * 默認(rèn)脫敏
     */
    DEFAULT,
    /**
     * 自定義脫敏
     */
    CUSTOM_RULE,
    /**
     * 手機號脫敏
     */
    PHONE,
    /**
     * 電子郵件脫敏
     */
    EMAIL,
    /**
     * 身份證號脫敏
     */
    ID_CARD,
    /**
     * 銀行卡號脫敏
     */
    BANK_CARD,
    /**
     * 地址脫敏
     */
    ADDRESS,
    /**
     * 中文姓名脫敏
     */
    CHINESE_NAME,
    /**
     * 密碼脫敏
     */
    PASSWORD,
}

3.4 創(chuàng)建自定義序列化類

Hutool支持的脫敏數(shù)據(jù)類型包括:

  1. 用戶id
  2. 中文姓名
  3. 身份證號
  4. 座機號
  5. 手機號
  6. 地址
  7. 電子郵件
  8. 密碼
  9. 中國大陸車牌,包含普通車輛、新能源車輛
  10. 銀行卡

整體來說,所謂脫敏就是隱藏掉信息中的一部分關(guān)鍵信息,用*代替。大家可以自己看一看DesensitizedUtil類中方法,其實就是replace方法和hide方法的使用,想要自定義規(guī)則進行隱藏可以仿照進行實現(xiàn)。

/**
 * 脫敏序列化器,用于在序列化字符串時根據(jù)不同的脫敏類型進行數(shù)據(jù)脫敏。
 *
 * @author shijun
 * @date 2024/07/08
 */
public class DesensitizeSerializer extends JsonSerializer<String> implements ContextualSerializer {

    /**
     * 脫敏類型,默認(rèn)為DEFAULT
     */
    private DesensitizeType type;
    /**
     * 脫敏起始位置
     */
    private int startInclude;
    /**
     * 脫敏結(jié)束位置
     */
    private int endExclude;

    public DesensitizeSerializer() {
        this.type = DesensitizeType.DEFAULT;
    }


    public DesensitizeSerializer(DesensitizeType type) {
        this.type = type;
    }

    /**
     * 序列化字符串時調(diào)用,根據(jù)脫敏類型對字符串進行相應(yīng)的脫敏處理。
     *
     * @param value       待序列化的字符串
     * @param gen         JSON生成器,用于寫入處理后的字符串
     * @param serializers 序列化器提供者,用于獲取其他序列化器
     * @throws IOException 如果序列化過程中發(fā)生I/O錯誤
     */
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        switch (type) {
            case CUSTOM_RULE:
                // 這里是對字符串的startInclude到endExclude字段進行隱藏處理,如果想要實現(xiàn)兩端保留,可以考慮使用StrUtil的replace方法
                gen.writeString(StrUtil.hide(value, startInclude, endExclude));
                break;
            case PHONE:
                gen.writeString(DesensitizedUtil.mobilePhone(value));
                break;
            case EMAIL:
                gen.writeString(DesensitizedUtil.email(value));
                break;
            case ID_CARD:
                gen.writeString(DesensitizedUtil.idCardNum(value, 1, 2));
                break;
            case BANK_CARD:
                gen.writeString(DesensitizedUtil.bankCard(value));
                break;
            case ADDRESS:
                gen.writeString(DesensitizedUtil.address(value, 8));
                break;
            case CHINESE_NAME:
                gen.writeString(DesensitizedUtil.chineseName(value));
                break;
            case PASSWORD:
                gen.writeString(DesensitizedUtil.password(value));
                break;
            default:
                gen.writeString(value);
                break;
        }
    }

    /**
     * 根據(jù)上下文信息創(chuàng)建自定義的序列化器,用于處理帶有@Desensitize注解的屬性。
     *
     * @param prov     序列化器提供者,用于獲取其他序列化器
     * @param property 當(dāng)前屬性的信息,用于獲取注解和屬性類型
     * @return 自定義的序列化器實例
     */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
        if (property != null) {
            Desensitize annotation = property.getAnnotation(Desensitize.class);
            if (annotation != null) {
                this.type = annotation.type();
                if (annotation.type() == DesensitizeType.CUSTOM_RULE) {
                    this.startInclude = annotation.startInclude();
                    this.endExclude = annotation.endExclude();
                }
            }
        }
        return this;
    }

}

代碼分析:

  • serialize方法在序列化字符串時被調(diào)用,根據(jù)脫敏類型對字符串進行相應(yīng)的脫敏處理。根據(jù)不同的脫敏類型,使用不同的處理方法對字符串進行脫敏,并將處理后的字符串寫入JSON生成器中。
  • createContextual方法根據(jù)上下文信息創(chuàng)建自定義的序列化器,用于處理帶有@Desensitize注解的屬性。它通過獲取注解中的脫敏類型和自定義規(guī)則的起始位置和結(jié)束位置,對實例進行相應(yīng)的設(shè)置,并返回自定義的序列化器實例。

這個序列化器的主要用途是在 JSON 序列化過程中自動對標(biāo)記了 @Desensitize 注解的字段進行脫敏處理。

四、測試

4.1 編寫測試代碼

  • 編寫實體類
@Data
public class UserDTO {

    /**
     * 用戶姓名
     */
    @Desensitize(type = DesensitizeType.CHINESE_NAME)
    private String name;

    /**
     * 用戶手機號
     */
    @Desensitize(type = DesensitizeType.PHONE)
    private String phoneNumber;

    /**
     * 用戶電子郵件地址
     */
    @Desensitize(type = DesensitizeType.EMAIL)
    private String email;

    /**
     * 用戶密碼
     */
    @Desensitize(type = DesensitizeType.PASSWORD)
    private String password;

    /**
     * 用戶身份證號碼
     */
    @Desensitize(type = DesensitizeType.ID_CARD)
    private String idCard;

    /**
     * 用戶銀行卡號
     */
    @Desensitize(type = DesensitizeType.BANK_CARD)
    private String bankCard;

    /**
     * 用戶地址
     */
    @Desensitize(type = DesensitizeType.ADDRESS)
    private String address;

    /**
     * 游戲名稱
     */
    @Desensitize(type = DesensitizeType.CUSTOM_RULE, startInclude = 2, endExclude = 6)
    private String gameName;
}

  • 編寫測試接口
@RestController
@RequestMapping("/test")
public class TestController {
    
    @GetMapping("/desensitize")
    public UserDTO getUser() {
        UserDTO userDTO = new UserDTO();
        userDTO.setName("孫大圣");
        userDTO.setEmail("shijun@163.com");
        userDTO.setPhoneNumber("12345678901");
        userDTO.setPassword("123456");
        userDTO.setAddress("遼寧省盤錦市興隆臺區(qū)紅村鄉(xiāng)441號");
        userDTO.setIdCard("447465200912089605");
        userDTO.setBankCard("6217000000000000000");
        userDTO.setGameName("超級無敵大鐵錘");
        return userDTO;
    }

}

4.2 測試

五、總結(jié)

在本文中,我們探討了在SpringBoot應(yīng)用程序中實現(xiàn)數(shù)據(jù)脫敏的重要性,并提出了通過自定義注解結(jié)合Hutool脫敏工具類實現(xiàn)數(shù)據(jù)脫敏的解決方案。通過這個方案,我們能夠有效地對敏感數(shù)據(jù)進行脫敏處理,從而保護用戶隱私和數(shù)據(jù)安全,希望對大家有所幫助。

以上就是SpringBoot實現(xiàn)接口返回數(shù)據(jù)脫敏的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot接口數(shù)據(jù)脫敏的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot多環(huán)境配置及配置文件分類實例詳解

    SpringBoot多環(huán)境配置及配置文件分類實例詳解

    這篇文章主要介紹了SpringBoot多環(huán)境配置及配置文件分類,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實例

    springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實例

    本文主要介紹了springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot整合Xxl-Job的完整步驟記錄

    SpringBoot整合Xxl-Job的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于SpringBoot整合Xxl-Job的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java開發(fā)實現(xiàn)人機猜拳游戲

    Java開發(fā)實現(xiàn)人機猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java開發(fā)實現(xiàn)人機猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法

    在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法

    在Java軟件中放置圖片,通常涉及將圖片文件(如JPEG、PNG等)作為資源包含在我們的項目中,并在代碼中通過適當(dāng)?shù)姆绞揭眠@些資源,這可以通過多種方式實現(xiàn),但最常見的是在Java桌面應(yīng)用(如Swing或JavaFX)或Web應(yīng)用(如Servlet/JSP)中
    2024-11-11
  • 詳解Spring MVC CORS 跨域

    詳解Spring MVC CORS 跨域

    本篇文章主要介紹了詳解Spring MVC CORS 跨域 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • JavaWeb入門:HttpResponse和HttpRequest詳解

    JavaWeb入門:HttpResponse和HttpRequest詳解

    這篇文章主要介紹了Django的HttpRequest和HttpResponse對象,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Java使用OpenCV實現(xiàn)實時對象追蹤的代碼示例

    Java使用OpenCV實現(xiàn)實時對象追蹤的代碼示例

    視覺跟蹤是指通過分析視頻幀來自動追蹤一個或多個移動對象的過程,這項技術(shù)廣泛應(yīng)用于監(jiān)控、人機交互、增強現(xiàn)實和自動駕駛等領(lǐng)域,本文給大家介紹了Java如何使用OpenCV實現(xiàn)實時對象追蹤,需要的朋友可以參考下
    2025-09-09
  • Spring中的EventListenerMethodProcessor組件詳解

    Spring中的EventListenerMethodProcessor組件詳解

    這篇文章主要介紹了Spring中的EventListenerMethodProcessor組件詳解,EventListenerMethodProcessor 是 Spring 事件機制中非常重要的一個組件,它管理了一組EventListenerFactory組件,用來將應(yīng)用中每個使用@EventListener注解定義的事件監(jiān)聽,需要的朋友可以參考下
    2023-12-12
  • java8使用filter()取出自己所需數(shù)據(jù)

    java8使用filter()取出自己所需數(shù)據(jù)

    這篇文章主要介紹了java8使用filter()取出自己所需數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

利川市| 徐州市| 柳州市| 平江县| 宝丰县| 深水埗区| 怀安县| 河南省| 甘孜县| 乌鲁木齐县| 越西县| 东港市| 中西区| 达州市| 灵宝市| 调兵山市| 肇源县| 临清市| 商丘市| 漯河市| 江阴市| 清涧县| 曲周县| 雷州市| 泽州县| 四川省| 望江县| 理塘县| 牙克石市| 剑阁县| 曲沃县| 咸阳市| 多伦县| 德昌县| 灵石县| 罗定市| 眉山市| 桓仁| 庆元县| 天气| 唐山市|