动态脱敏的一种思路
引言
本文只是记录一种动态定义脱敏字段的解决方法。
本人是一个Java实习生,本方法只针对特殊环境进行使用。
此方法已运用与某区域医疗集成平台以及某健康门户Vip平台
注:此方法不适合大并发项目。
现有方案
思路
-
无需重启即可更新字段
-
解决方案
-
写在独立的配置文件
-
独立维护一个表(脱敏表),存储脱敏规则,定期读取更新或者触发式读取更新
此处独立选择维护一个脱敏表。
项目启动时,将需要脱敏的表,字段以及字段对应的规则全部读取存入Hash Map 中。
对外暴露一个新增和更新接口,触发新增或者更新接口时,通知工具类对Hash Map进行更新。(观察者模式)
下为规则更新的伪代码。仅展示单个表的方法,多表则修改Hash Map的存储类型即可
public class DesensitiseUtil{ /** * Long为角色id,List<String>规则存储方法 */ static HashMap<Long, List<String>> desensitiseMap = new HashMap<>(); /** * 观察者模式,插入新的规则或者更新规则触发 */ public static void update() { // 读取数据库 // 根据Key更新对应的 Hash Map的值 } }
下为外暴接口,提供给Controller层调用
@Service public class DesensitiseServiceImpl implements DesensitiseService { @Override public int insertOrUpdateRule(Dto dto){ // 插入或者更新 // 根据dto的输入更新脱敏规则表 // 调用DesensitiseUtil的更新接口 DesensitiseUtil.update(); // 返回插入或者更新影响行数 } }
-
-
-
脱敏方法
-
解决方案
- 通过反射进行脱敏
public class DesensitiseUtil { /** * 对任意类型的属性进行 * * @param result 查询结果 * @param fieldName 需要脱敏的属性 */ public static <T> void desensitise(T result, String fieldName) { Field field = ReflectionUtils.findField(result.getClass(), fieldName); if (field != null) { field.setAccessible(true); switch (fieldName) { case "mobile": { Reflectio
-