專案介紹
日誌脫敏是常見的安全需求。普通的基於工具類方法的方式,對程式碼的入侵性太強。編寫起來又特別麻煩。
本專案提供基於註解的方式,並且內建了常見的脫敏方式,便於開發。
特性
-
基於註解的日誌脫敏。
-
可以自定義策略實現,策略生效條件。
-
常見的脫敏內建方案。
-
java 深拷貝,且原始物件不用實現任何介面。
-
支援使用者自定義註解。
自定義註解
maven 匯入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-core</artifactId>
<version>0.0.4</version>
</dependency>
複製程式碼
自定義註解
v0.0.4 新增功能。允許功能自定義條件註解和策略註解。
案例
自定義註解
- 策略脫敏
/**
* 自定義密碼脫敏策略
* @author binbin.hou
* date 2019/1/17
* @since 0.0.4
*/
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@SensitiveStrategy(CustomPasswordStrategy.class)
public @interface SensitiveCustomPasswordStrategy {
}
複製程式碼
- 脫敏生效條件
/**
* 自定義密碼脫敏策略生效條件
* @author binbin.hou
* date 2019/1/17
* @since 0.0.4
*/
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@SensitiveCondition(ConditionFooPassword.class)
public @interface SensitiveCustomPasswordCondition{
}
複製程式碼
- TIPS
@SensitiveStrategy
策略單獨使用的時候,預設是生效的。
如果有 @SensitiveCondition
註解,則只有當條件滿足時,才會執行脫敏策略。
@SensitiveCondition
只會對系統內建註解和自定義註解生效,因為 @Sensitive
有屬於自己的策略生效條件。
- 策略優先順序
@Sensitive
優先生效,然後是系統內建註解,最後是使用者自定義註解。
對應的實現
兩個元註解 @SensitiveStrategy
、@SensitiveCondition
分別指定了對應的實現。
- CustomPasswordStrategy.java
public class CustomPasswordStrategy implements IStrategy {
@Override
public Object des(Object original, IContext context) {
return "**********************";
}
}
複製程式碼
- ConditionFooPassword.java
/**
* 讓這些 123456 的密碼不進行脫敏
* @author binbin.hou
* date 2019/1/2
* @since 0.0.1
*/
public class ConditionFooPassword implements ICondition {
@Override
public boolean valid(IContext context) {
try {
Field field = context.getCurrentField();
final Object currentObj = context.getCurrentObject();
final String name = (String) field.get(currentObj);
return !name.equals("123456");
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
複製程式碼
定義測試物件
定義一個使用自定義註解的物件。
public class CustomPasswordModel {
@SensitiveCustomPasswordCondition
@SensitiveCustomPasswordStrategy
private String password;
@SensitiveCustomPasswordCondition
@SensitiveStrategyPassword
private String fooPassword;
//其他方法
}
複製程式碼
測試
/**
* 自定義註解測試
*/
@Test
public void customAnnotationTest() {
final String originalStr = "CustomPasswordModel{password='hello', fooPassword='123456'}";
final String sensitiveStr = "CustomPasswordModel{password='**********************', fooPassword='123456'}";
CustomPasswordModel model = buildCustomPasswordModel();
Assert.assertEquals(originalStr, model.toString());
CustomPasswordModel sensitive = SensitiveUtil.desCopy(model);
Assert.assertEquals(sensitiveStr, sensitive.toString());
Assert.assertEquals(originalStr, model.toString());
}
複製程式碼
構建物件的方法如下:
/**
* 構建自定義密碼物件
* @return 物件
*/
private CustomPasswordModel buildCustomPasswordModel(){
CustomPasswordModel model = new CustomPasswordModel();
model.setPassword("hello");
model.setFooPassword("123456");
return model;
}
複製程式碼