欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于java實現(xiàn)一個脫敏組件

 更新時間:2024年11月13日 08:20:08   作者:allbs  
這篇文章主要為大家詳細介紹了如何基于java實現(xiàn)一個脫敏組件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

功能說明

因為最近有脫敏的需求,所以就趁著這個機會自己實現(xiàn)了一個??隙ㄟ€有不少開源庫有這種功能,但是考慮到不一定滿足自己的需要,所以就自己造了一個輪子自己用。主要功能包括

  • 接口返回內(nèi)容的脫敏,包含json序列化方式和aop的兩種實現(xiàn)。
  • json序列化方式只能用于接口數(shù)據(jù)返回,在程序內(nèi)部和數(shù)據(jù)庫并不脫敏。
  • aop的方式,在程序內(nèi)部和接口數(shù)據(jù)返回時可以脫敏,但是數(shù)據(jù)庫不脫敏,且速度是慢于序列化方式的。
  • 根據(jù)自己的需求來實現(xiàn)脫敏規(guī)則,比如有些人的手機號脫敏是中間四位,有些人又只保留初始和末尾一位。
  • 自定義脫敏字符,默認為*。
  • 請求體數(shù)據(jù)自動過濾,比如你傳向前端的數(shù)據(jù)是包含脫敏字符的,正常的做法是前端判斷時候包含脫敏字符,如果包含則該字段不往后端傳輸。我這邊實現(xiàn)的是,如果請求體傳過來的數(shù)據(jù)內(nèi)容跟改字段的脫敏規(guī)則一致則不接收該字段內(nèi)容,不,準確的說是在接收該字段內(nèi)容之前轉(zhuǎn)為null。

使用示例

總共有四種使用場景:

1.作用與方法上的aop注解

@Desensitizes({@Desensitize(field = "username", exclude = true), @Desensitize(field = "phoneNumber", type = MobilePhoneDesensitizer.class), @Desensitize(field = "email", type = EmailDesensitizer.class, maskChar = "#")})  
@GetMapping("/testMethodAnno")  
public TestNoAnnoVO testMethodAnno() {  
    TestNoAnnoVO test = new TestNoAnnoVO();  
    test.setUsername("JohnDoe");  
    test.setPhoneNumber("13812345678");  
    test.setEmail("john.doe@example.com");  
    return test;  
}

@Data  
public class TestNoAnnoVO {  
  
    private String username;  
  
    private String phoneNumber;  
  
    private String email;  
}

輸出內(nèi)容為:

2.作用于實體字段的aop注解

@GetMapping("/testFieldAnno")  
public TestVO testFieldAnno() {  
    TestVO test = new TestVO();  
    test.setUsername("JohnDoe");  
    test.setPhoneNumber("13812345678");  
    test.setEmail("john.doe@example.com");  
    test.setIdCard("123456199001011234");  
    return test;  
}

public class TestVO {  
  
    @Desensitize(exclude = true)  
    private String username;  
  
    @Desensitize(type = MobilePhoneDesensitizer.class)  
    private String phoneNumber;  
  
    @Desensitize(type = EmailDesensitizer.class, maskChar = "#")  
    private String email;  
  
    @Desensitize(type = IDCardDesensitizer.class, maskChar = "%")  
    private String idCard;  
}

輸出內(nèi)容為:

3.序列化注解

@GetMapping("/testJsonAnno")  
public TestJsonVO testJsonAnno() {  
    TestJsonVO test = new TestJsonVO();  
    test.setUsername("JohnDoe");  
    test.setPhoneNumber("13812345678");  
    test.setEmail("j@example.com");  
    test.setIdCard("123456199001011234");  
    return test;  
}

@Data  
public class TestJsonVO {  
  
    @JsonDesensitize(exclude = true)  
    private String username;  
  
    @JsonDesensitize(type = MobilePhoneDesensitizer.class)  
    private String phoneNumber;  
  
    @JsonDesensitize(type = EmailDesensitizer.class, maskChar = "#")  
    private String email;  
  
    @JsonDesensitize(type = IDCardDesensitizer.class)  
    private String idCard;  
}

這個有些區(qū)別,如果設置了exclude為true,則直接將返回的該字段隱去。輸出內(nèi)容為:

最后就是基于@JsonDesensitize額外加了一個屬性ignoreDesensitized,用于判斷是否在接收數(shù)據(jù)時排除脫敏內(nèi)容。

@PostMapping("testPut")  
public void testPut(@RequestBody TestDTO testDTO) {  
    log.info("接收到的數(shù)據(jù)內(nèi)容為{}", testDTO.toString());  
}

@Data  
public class TestDTO {  
  
    @JsonDesensitize(exclude = true, ignoreDesensitized = true)  
    private String username;  
  
    @JsonDesensitize(type = MobilePhoneDesensitizer.class, ignoreDesensitized = true)  
    private String phoneNumber;  
  
    @JsonDesensitize(type = EmailDesensitizer.class, maskChar = "#", ignoreDesensitized = true)  
    private String email;  
  
    @JsonDesensitize(type = IDCardDesensitizer.class, ignoreDesensitized = true)  
    private String idCard;  
}

使用效果為:

這個是嚴格按照輸出時的脫敏匹配的,比如輸出時手機號脫敏內(nèi)容為138****1234,那么136****4321則不會接收,正常沒有*的手機號或者不符合該規(guī)則的比如13****51234這種也會被正常接收。當然這個規(guī)則是可以在項目中自定義的。

使用說明

項目地址

github.com/chenqi92/alltobs-desensitization-all 里面包含待引入的jar和demo,因為剛寫完,簡單測試了一下不排除有其他bug,有需要可以自己fork一下自己改。后續(xù)我會在項目中實際使用,如果發(fā)現(xiàn)有bug會不斷更新,當然也歡迎提issuses。

引入jar

<dependency>  
    <groupId>com.alltobs</groupId>  
    <artifactId>alltobs-desensitization</artifactId>  
    <version>1.0.0</version>  
</dependency>

工具已經(jīng)上傳到了maven的中央倉庫,國內(nèi)的用戶可能存在下載困難等問題,需要科學一下。使用國內(nèi)的阿里等平臺代理,以我以往經(jīng)驗同步過去起碼要半個月把。

啟用功能

啟動類添加注解@EnableAllbsDesensitization

根據(jù)自己使用場景的需要、以及上述示例來選擇性的添加注解

@Desensitize

@Desensitizes

@JsonDesensitize

自定義在項目中實現(xiàn)一個自己需要的脫敏方式

如果你不想用默認的脫敏方式,實際上我也沒寫幾個,后續(xù)應該會接著加。 那么就在你的項目工程中自定義集成BaseDesensitizer類然后自己實現(xiàn)desensitizegetDesensitizedRegex方法即可。 這兩個方法一個是用于脫敏規(guī)則,一個是用于接收數(shù)據(jù)時判斷是否符合規(guī)則。 具體實現(xiàn)以身份證號為例:

package com.alltobs.alltobsdesensitizationdemo.desensitizer;  
  
import com.alltobs.desensitization.desensitizer.BaseDesensitizer;  
  
import java.util.regex.Pattern;  
  
/**  
 * 類 IDCardDesensitizer  
 * * @author ChenQi  
 * &#064;date 2024/11/11  
 */public class IDCardDesensitizer extends BaseDesensitizer {  
  
    @Override  
    public String desensitize(String value, String maskChar) {  
        if (value != null && (value.length() == 15 || value.length() == 18)) {  
            // 脫敏中間部分  
            int prefixLength = 6;  
            int suffixLength = 4;  
            int maskLength = value.length() - prefixLength - suffixLength;  
  
            String prefix = value.substring(0, prefixLength);  
            String suffix = value.substring(value.length() - suffixLength);  
            String maskedSection = maskChar.repeat(maskLength);  
            return prefix + maskedSection + suffix;  
        }  
        return value;  
    }  
  
    @Override  
    public String getDesensitizedRegex(String maskChar) {  
        String escapedMaskChar = Pattern.quote(maskChar);  
        // 身份證號可能是 15 位或 18 位,這里統(tǒng)一處理  
        String maskPattern = escapedMaskChar + "+";  
        return "^\\d{6}" + maskPattern + "\\d{4}$";  
    }  
}

以上就是基于java實現(xiàn)一個脫敏組件的詳細內(nèi)容,更多關(guān)于java脫敏組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論