狸花猫日志脱敏:敏感信息保护实践

狸花猫日志脱敏:敏感信息保护实践

【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 【免费下载链接】lihua 项目地址: https://gitcode.com/weixin_44118742/lihua

在企业级应用开发中,日志记录是系统监控、问题排查和安全审计的重要手段。然而,日志中往往包含用户身份证号、手机号、邮箱等敏感信息,若未妥善处理,可能导致数据泄露风险。狸花猫(Lihua)作为基于SpringBoot和Vue的权限管理系统,通过注解驱动AOP切面相结合的方式,实现了灵活高效的日志脱敏机制。本文将深入解析其脱敏原理、核心实现及最佳实践,帮助开发者构建更安全的信息系统。

脱敏机制整体架构

狸花猫的日志脱敏系统采用三层架构设计,通过注解标记敏感字段、AOP切面拦截处理、策略模式实现多样化脱敏算法,形成完整的防护链条。

核心组件关系

mermaid

脱敏流程时序图

mermaid

核心注解与实现类

狸花猫通过自定义注解实现脱敏规则的声明式配置,核心注解定义在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位用*代替13800138000138****8000
身份证号(ID_CARD)保留前6后4位,中间用*代替110101199001011234110101********1234
邮箱(EMAIL)用户名保留首字符,域名保留完整example@lihua.come******@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

用户管理界面-普通用户视角

脱敏异常处理与监控

狸花猫提供完善的脱敏异常处理机制,确保脱敏过程失败时不影响主业务流程,并通过日志记录异常详情。

异常处理流程

  1. 自定义异常类SensitiveException.java
  2. 全局异常捕获:在GlobalExceptionHandle.java中统一处理
  3. 错误码定义:在ResultCodeEnum.java中定义SENSITIVE_ERROR(507,"数据脱敏异常")

关键异常场景

  • 不支持的字段类型(如非字符串类型集合)
  • 反射获取字段值失败
  • 脱敏策略配置错误(如不存在的脱敏类型)

异常日志示例:

ERROR 2025-09-23 15:30:00 [com.lihua.aspect.SensitiveAspect] - 数据脱敏异常,无法处理 java.lang.Integer 类型的字段 age

扩展与最佳实践

自定义脱敏策略

  1. 扩展DesensitizedTypeEnum:添加新的脱敏类型枚举
  2. 实现自定义处理函数:在枚举中实现具体脱敏逻辑
  3. 注解应用:在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;
    }
}

性能优化建议

  1. 字段缓存:SensitiveAspect通过Guava Cache缓存反射获取的字段信息,减少重复反射开销
  2. 批量处理:对大量数据采用分页处理,避免内存溢出
  3. 角色缓存:用户角色信息缓存至Redis,减少权限判断耗时

安全审计建议

  1. 定期审查脱敏规则有效性
  2. 对管理员角色的敏感信息访问记录单独审计
  3. 结合系统日志操作日志.jpg分析异常访问行为

总结与展望

狸花猫的日志脱敏机制通过注解驱动AOP拦截策略模式三大核心技术,实现了敏感信息的自动化保护。其优势在于:

  1. 侵入性低:声明式注解不影响业务逻辑
  2. 灵活性高:支持角色豁免、多种脱敏算法
  3. 可扩展性强:轻松添加新脱敏策略

未来版本计划增强以下能力:

  • 动态配置脱敏规则(数据库存储)
  • 脱敏效果预览功能
  • 敏感信息访问水印追踪

通过本文介绍的脱敏实践,开发者可快速掌握企业级应用中的敏感信息保护方法,构建更安全可靠的权限管理系统。完整实现代码可参考项目lihua-core/src/main/java/com/lihua/aspect/SensitiveAspect.java及相关注解定义。

【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 【免费下载链接】lihua 项目地址: https://gitcode.com/weixin_44118742/lihua

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值