java 日誌脫敏框架 sensitive-新版本0.0.2-深度拷貝,屬性為物件和集合的支援

葉止水發表於2019-01-10

專案介紹

日誌脫敏是常見的安全需求。普通的基於工具類方法的方式,對程式碼的入侵性太強。編寫起來又特別麻煩。

本專案提供基於註解的方式,並且內建了常見的脫敏方式,便於開發。

使用者也可以基於自己的實際需要,自定義註解。

特性

  1. 基於註解的日誌脫敏

  2. 可以自定義策略實現,策略生效條件

  3. 常見的脫敏內建方案

  4. java 深拷貝,且原始物件不用實現任何介面。

快速開始

maven 匯入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive</artifactId>
    <version>0.0.2-core</version>
</dependency>
複製程式碼

定義物件

  • User.java

我們對 password 使用脫敏,指定脫敏策略為 StrategyPassword。(直接返回 null)

public class User {

    @Sensitive(strategy = StrategyChineseName.class)
    private String username;
    
    @Sensitive(strategy = StrategyCardId.class)
    private String idCard;
    
    @Sensitive(strategy = StrategyPassword.class)
    private String password;
    
    @Sensitive(strategy = StrategyEmail.class)
    private String email;
    
    @Sensitive(strategy = StrategyPhone.class)
    private String phone;
    
    //Getter & Setter
    //toString()
}
複製程式碼

屬性為集合或者物件

如果某個屬性是單個集合或者物件,則需要使用註解 @SensitiveEntry

  • 放在集合屬性上,且屬性為普通物件

會遍歷每一個屬性,執行上面的脫敏策略。

  • 放在物件屬性上

會處理物件中各個欄位上的脫敏註解資訊。

  • 放在集合屬性上,且屬性為物件

遍歷每一個物件,處理物件中各個欄位上的脫敏註解資訊。

放在集合屬性上,且屬性為普通物件

  • UserEntryBaseType.java

作為演示,集合中為普通的字串。

public class UserEntryBaseType {

    @SensitiveEntry
    @Sensitive(strategy = StrategyChineseName.class)
    private List<String> chineseNameList;

    @SensitiveEntry
    @Sensitive(strategy = StrategyChineseName.class)
    private String[] chineseNameArray;
    
    //Getter & Setter & toString()
}
複製程式碼
  • 構建物件
/**
 * 構建使用者-屬性為列表,列表中為基礎屬性
 * @return 構建巢狀資訊
 * @since 0.0.2
 */
public static UserEntryBaseType buildUserEntryBaseType() {
    UserEntryBaseType userEntryBaseType = new UserEntryBaseType();
    userEntryBaseType.setChineseNameList(Arrays.asList("盤古", "女媧", "伏羲"));
    userEntryBaseType.setChineseNameArray(new String[]{"盤古", "女媧", "伏羲"});
    return userEntryBaseType;
}
複製程式碼
  • 測試演示
/**
 * 使用者屬性中有集合或者map,集合中屬性是基礎型別-脫敏測試
 * @since 0.0.2
 */
@Test
public void sensitiveEntryBaseTypeTest() {
    UserEntryBaseType userEntryBaseType = DataPrepareTest.buildUserEntryBaseType();
    System.out.println("脫敏前原始: " + userEntryBaseType);
    UserEntryBaseType sensitive = SensitiveUtil.desCopy(userEntryBaseType);
    System.out.println("脫敏物件: " + sensitive);
    System.out.println("脫敏後原始: " + userEntryBaseType);
}
複製程式碼
  • 日誌資訊
脫敏前原始: UserEntryBaseType{chineseNameList=[盤古, 女媧, 伏羲], chineseNameArray=[盤古, 女媧, 伏羲]}
脫敏物件: UserEntryBaseType{chineseNameList=[*古, *媧, *羲], chineseNameArray=[*古, *媧, *羲]}
脫敏後原始: UserEntryBaseType{chineseNameList=[盤古, 女媧, 伏羲], chineseNameArray=[盤古, 女媧, 伏羲]}
複製程式碼

放在物件屬性上

  • 演示物件

這裡的 User 和上面的 User 物件一致。

public class UserEntryObject {

    @SensitiveEntry
    private User user;

    @SensitiveEntry
    private List<User> userList;

    @SensitiveEntry
    private User[] userArray;
    
    //...
}
複製程式碼
  • 物件構建
/**
 * 構建使用者-屬性為列表,陣列。列表中為物件。
 * @return 構建巢狀資訊
 * @since 0.0.2
 */
public static UserEntryObject buildUserEntryObject() {
    UserEntryObject userEntryObject = new UserEntryObject();
    User user = buildUser();
    User user2 = buildUser();
    User user3 = buildUser();
    userEntryObject.setUser(user);
    userEntryObject.setUserList(Arrays.asList(user2));
    userEntryObject.setUserArray(new User[]{user3});
    return userEntryObject;
}
複製程式碼
  • 測試演示
/**
 * 使用者屬性中有集合或者物件,集合中屬性是物件-脫敏測試
 * @since 0.0.2
 */
@Test
public void sensitiveEntryObjectTest() {
    UserEntryObject userEntryObject = DataPrepareTest.buildUserEntryObject();
    System.out.println("脫敏前原始: " + userEntryObject);
    UserEntryObject sensitiveUserEntryObject = SensitiveUtil.desCopy(userEntryObject);
    System.out.println("脫敏物件: " + sensitiveUserEntryObject);
    System.out.println("脫敏後原始: " + userEntryObject);
}
複製程式碼
  • 測試結果
脫敏前原始: UserEntryObject{user=User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}, userList=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}], userArray=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}]}
脫敏物件: UserEntryObject{user=User{username='脫*君', idCard='123456**********34', password='null', email='123**@qq.com', phone='188****8888'}, userList=[User{username='脫*君', idCard='123456**********34', password='null', email='123**@qq.com', phone='188****8888'}], userArray=[User{username='脫*君', idCard='123456**********34', password='null', email='123**@qq.com', phone='188****8888'}]}
脫敏後原始: UserEntryObject{user=User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}, userList=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}], userArray=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}]}
複製程式碼

需求 & BUGS

issues

歡迎加入開發

如果你對本專案有興趣,並且對程式碼有一定追求,可以申請加入本專案開發。

如果你善於寫文件,或者願意補全測試案例,也非常歡迎加入。

相關文章