專案介紹
日誌脫敏是常見的安全需求。普通的基於工具類方法的方式,對程式碼的入侵性太強。編寫起來又特別麻煩。
本專案提供基於註解的方式,並且內建了常見的脫敏方式,便於開發。
使用者也可以基於自己的實際需要,自定義註解。
特性
-
基於註解的日誌脫敏
-
可以自定義策略實現,策略生效條件
-
常見的脫敏內建方案
-
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
歡迎加入開發
如果你對本專案有興趣,並且對程式碼有一定追求,可以申請加入本專案開發。
如果你善於寫文件,或者願意補全測試案例,也非常歡迎加入。