狸花猫日志脱敏:敏感信息保护实践
【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 项目地址: https://gitcode.com/weixin_44118742/lihua
在企业级应用开发中,日志记录是系统监控、问题排查和安全审计的重要手段。然而,日志中往往包含用户身份证号、手机号、邮箱等敏感信息,若未妥善处理,可能导致数据泄露风险。狸花猫(Lihua)作为基于SpringBoot和Vue的权限管理系统,通过注解驱动与AOP切面相结合的方式,实现了灵活高效的日志脱敏机制。本文将深入解析其脱敏原理、核心实现及最佳实践,帮助开发者构建更安全的信息系统。
脱敏机制整体架构
狸花猫的日志脱敏系统采用三层架构设计,通过注解标记敏感字段、AOP切面拦截处理、策略模式实现多样化脱敏算法,形成完整的防护链条。
核心组件关系
脱敏流程时序图
核心注解与实现类
狸花猫通过自定义注解实现脱敏规则的声明式配置,核心注解定义在lihua-common/src/main/java/com/lihua/annotation/sensitive/目录下,配合AOP切面完成动态脱敏。
三大核心注解
| 注解名称 | 作用范围 | 核心属性 | 应用场景示例 |
|---|---|---|---|
@ApplySensitive | 方法级别 | 无 | 标记Service层查询方法 |
@Sensitive | 字段级别 | type: 脱敏类型ignoreRoleCodes: 豁免角色 | 用户手机号、身份证号字段 |
@DeepSensitive | 字段级别 | 无 | 嵌套对象或集合类型的深度脱敏 |
注解源码解析
1. @Sensitive注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Sensitive {
/**
* 数据脱敏类型,在 DesensitizedTypeEnum 中维护
*/
DesensitizedTypeEnum type();
/**
* 忽略数据脱敏的角色编码
*/
String[] ignoreRoleCodes() default {};
}
该注解定义在lihua-common/src/main/java/com/lihua/annotation/sensitive/Sensitive.java,通过type属性指定脱敏算法,ignoreRoleCodes支持为特定角色(如管理员)保留原始数据查看权限。
2. SensitiveAspect切面
核心处理逻辑位于SensitiveAspect.java,通过@Around注解拦截标记@ApplySensitive的方法,实现返回值的脱敏处理:
@Around("@annotation(applySensitive)")
public Object around(ProceedingJoinPoint proceedingJoinPoint, ApplySensitive applySensitive) {
Object object = proceedingJoinPoint.proceed(); // 执行原方法
return process(object); // 对返回值进行脱敏处理
}
脱敏算法与数据类型支持
狸花猫实现了多种内置脱敏算法,覆盖常见敏感信息类型,并通过灵活的类型处理器支持复杂数据结构的脱敏。
内置脱敏策略
| 脱敏类型 | 处理规则 | 示例输入 | 脱敏输出 |
|---|---|---|---|
| 手机号(PHONE_NUMBER) | 保留前3后4位,中间4位用*代替 | 13800138000 | 138****8000 |
| 身份证号(ID_CARD) | 保留前6后4位,中间用*代替 | 110101199001011234 | 110101********1234 |
| 邮箱(EMAIL) | 用户名保留首字符,域名保留完整 | example@lihua.com | e******@lihua.com |
复杂数据类型处理
SensitiveAspect支持对多种数据容器进行脱敏,包括:
- 分页对象(IPage):自动遍历处理
records集合 - 集合类型(Collection):递归处理列表、Set等元素
- Map类型:遍历键值对,对String类型value脱敏
- 数组类型:按索引逐个处理元素
- 嵌套对象:通过
@DeepSensitive实现深度遍历
关键处理逻辑如下:
private Object process(Object object) {
if (object instanceof IPage<?> iPage) {
iPage.getRecords().forEach(this::process); // 分页数据处理
} else if (object instanceof Collection<?> collection) {
collection.forEach(this::process); // 集合数据处理
} else if (object instanceof Map<?,?> map) {
map.forEach((k, v) -> process(v)); // Map数据处理
} else if (object instanceof Object[] arr) {
for (Object o : arr) { process(o); } // 数组数据处理
} else {
sensitive(object); // 单个对象处理
}
return object;
}
实战应用:用户信息脱敏
以用户管理模块为例,展示狸花猫脱敏机制的完整应用流程。
1. VO对象字段标记
在SysUserVO.java中,对手机号字段添加@Sensitive注解:
public class SysUserVO {
private Long userId;
private String username;
@Sensitive(type = DesensitizedTypeEnum.PHONE_NUMBER, ignoreRoleCodes = {"ADMIN"})
private String phone;
// 其他字段...
}
2. Service方法启用脱敏
在用户查询方法上添加@ApplySensitive注解,触发AOP拦截:
@Service
public class SysUserServiceImpl implements SysUserService {
@ApplySensitive // 启用返回值脱敏
@Override
public IPage<SysUserVO> selectPage(Page<SysUser> page, SysUserQueryDTO queryDTO) {
// 业务查询逻辑...
}
}
3. 角色豁免效果验证
- 普通用户视角:手机号显示为
138****8000 - ADMIN角色视角:手机号显示完整号码
13800138000
脱敏异常处理与监控
狸花猫提供完善的脱敏异常处理机制,确保脱敏过程失败时不影响主业务流程,并通过日志记录异常详情。
异常处理流程
- 自定义异常类:SensitiveException.java
- 全局异常捕获:在GlobalExceptionHandle.java中统一处理
- 错误码定义:在ResultCodeEnum.java中定义
SENSITIVE_ERROR(507,"数据脱敏异常")
关键异常场景
- 不支持的字段类型(如非字符串类型集合)
- 反射获取字段值失败
- 脱敏策略配置错误(如不存在的脱敏类型)
异常日志示例:
ERROR 2025-09-23 15:30:00 [com.lihua.aspect.SensitiveAspect] - 数据脱敏异常,无法处理 java.lang.Integer 类型的字段 age
扩展与最佳实践
自定义脱敏策略
- 扩展DesensitizedTypeEnum:添加新的脱敏类型枚举
- 实现自定义处理函数:在枚举中实现具体脱敏逻辑
- 注解应用:在VO字段上引用新的枚举值
public enum DesensitizedTypeEnum {
// 已有类型...
CUSTOM((str) -> str.replaceAll("(.{2})(.*)(.{2})", "$1******$3"));
private final Function<String, String> function;
DesensitizedTypeEnum(Function<String, String> function) {
this.function = function;
}
public Function<String, String> getFunction() {
return function;
}
}
性能优化建议
- 字段缓存:SensitiveAspect通过Guava Cache缓存反射获取的字段信息,减少重复反射开销
- 批量处理:对大量数据采用分页处理,避免内存溢出
- 角色缓存:用户角色信息缓存至Redis,减少权限判断耗时
安全审计建议
- 定期审查脱敏规则有效性
- 对管理员角色的敏感信息访问记录单独审计
- 结合系统日志操作日志.jpg分析异常访问行为
总结与展望
狸花猫的日志脱敏机制通过注解驱动、AOP拦截、策略模式三大核心技术,实现了敏感信息的自动化保护。其优势在于:
- 侵入性低:声明式注解不影响业务逻辑
- 灵活性高:支持角色豁免、多种脱敏算法
- 可扩展性强:轻松添加新脱敏策略
未来版本计划增强以下能力:
- 动态配置脱敏规则(数据库存储)
- 脱敏效果预览功能
- 敏感信息访问水印追踪
通过本文介绍的脱敏实践,开发者可快速掌握企业级应用中的敏感信息保护方法,构建更安全可靠的权限管理系统。完整实现代码可参考项目lihua-core/src/main/java/com/lihua/aspect/SensitiveAspect.java及相关注解定义。
【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 项目地址: https://gitcode.com/weixin_44118742/lihua
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




