Spring Boot 中的审计方案选型:不止 JaVers

在 Spring Boot 项目中,"审计"几乎是绕不开的话题:
谁在什么时候,对什么数据,做了什么修改?

很多人第一反应是 JaVers ,也有人提到 Spring Boot 自带的审计接口。但在真实项目中,情况远比文档复杂。

本文将从 Spring Boot 官方能力 → 常见第三方方案 → 企业真实落地方式,系统梳理一套完整的审计方案选型思路。


一、什么是"审计"?先别急着选技术

在选方案前,先明确一点:

审计 ≠ 版本控制

审计通常分为三类:

  1. 字段审计:哪些字段变了
  2. 版本审计:历史快照、回溯
  3. 行为审计:谁做了什么业务动作

不同需求,方案完全不同。


二、Spring Boot 官方提供了什么?

1️⃣ Spring Data JPA Auditing(轻量级)

Spring Data 提供了开箱即用的审计能力,但只覆盖"基础审计字段"

典型能力:

  • 创建时间 / 修改时间
  • 创建人 / 修改人
java 复制代码
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Order {

    @CreatedDate
    private LocalDateTime createdTime;

    @LastModifiedDate
    private LocalDateTime updatedTime;

    @CreatedBy
    private String createdBy;

    @LastModifiedBy
    private String updatedBy;
}

特点总结:

✔ 零侵入

✔ 自动填充

❌ 不记录"改了什么"

❌ 无历史版本

📌 适合:通用业务字段,不适合作为完整审计方案


三、第三方通用审计方案

2️⃣ Hibernate Envers(实体版本审计)

Hibernate 官方提供的审计模块。

java 复制代码
@Audited
@Entity
public class Customer {
    private String name;
    private BigDecimal amount;
}

Envers 会自动生成 _AUD 表,记录实体每次变更的完整快照。

优点:

  • 自动化程度高
  • 无需写业务代码
  • 数据完整可靠

缺点:

  • 表数量膨胀
  • 查询 API 偏底层
  • 无业务语义(只有"改了")

📌 适合:合规性要求高、只关心"历史版本"的系统


3️⃣ JaVers(对象差异审计)

JaVers 更关注 对象快照 + 差异对比

java 复制代码
javers.commit("admin", entity);

可查询:

  • 历史版本
  • 字段差异
  • 提交链路

优点:

  • Diff 可读性强
  • 适合复杂对象
  • 支持 JSON 存储

缺点:

  • 需要显式 commit
  • 查询模型偏技术向
  • UI 展示需要二次封装

📌 适合:需要"字段级变更对比"的系统


四、企业中最常用的方案(重点)

现实中,大部分 Spring Boot 项目,并不会直接用 JaVers / Envers

而是选择下面这种方式。


五、⭐ 主流方案:业务审计表 + AOP(最常见)

核心思想

  • 不自动审计所有实体
  • 只审计关键业务操作
  • 以"业务语义"为中心

常见表结构

sql 复制代码
audit_log
---------
id
biz_type        -- 业务类型(流程 / 合同 / 凭证)
biz_id
action          -- CREATE / UPDATE / SUBMIT / APPROVE
operator_id
operator_name
before_data     -- JSON
after_data      -- JSON
diff_data       -- JSON
created_time

技术实现

  • 自定义 @AuditLog 注解
  • AOP 拦截 Service 层
  • 修改前后对象序列化为 JSON
  • 可选字段级 diff
java 复制代码
@Around("@annotation(AuditLog)")
public Object audit(ProceedingJoinPoint pjp) throws Throwable {
    Object before = loadBeforeData();
    Object result = pjp.proceed();
    Object after = result;
    saveAudit(before, after);
    return result;
}

为什么这是事实上的"标准方案"?

✔ 业务可控

✔ 性能可控

✔ 审计数据"人能看懂"

✔ 易于做审计 UI

📌 OA / ERP / 审批 / 流程系统的首选方案


六、操作日志(行为审计)

很多系统并不关心字段差异,只关心:

谁,在什么时候,做了什么操作

示例:

复制代码
张三 于 2025-01-08 审批了《资金申请单》

技术方式:

  • Controller / Service AOP
  • 请求参数 + 操作结果
  • IP / 用户 / TraceId

📌 流程系统中使用频率极高


七、事件驱动 & 数据库级审计(补充)

事件驱动审计

  • Spring Event
  • MQ(Kafka / RabbitMQ)

适合:

  • 微服务
  • 高并发
  • 审计不影响主事务

数据库级审计

  • Trigger
  • Binlog + Canal

适合:

  • 合规
  • 金融审计
  • 非业务查询场景

八、方案使用率经验排名(真实项目)

排名 方案
🥇 业务审计表 + AOP
🥈 操作日志
🥉 Spring Data JPA Auditing
4️⃣ 自定义字段 Diff
5️⃣ Envers
6️⃣ JaVers

九、推荐组合方案(实战)

在真实项目中,推荐 组合使用

text 复制代码
Spring Data Auditing     → 时间 / 人
AOP 业务审计表           → 行为 & 业务语义
(可选)JaVers           → 关键对象 Diff

这种方案:

  • 可读性强
  • 扩展性好
  • 不"技术绑架"业务

十、总结

Spring Boot 并没有一个"万能审计接口",但提供了良好的基础能力。

选型原则只有一句话:

审计给"人"看,用业务方案;
审计给"系统"看,用技术方案。

相关推荐
2601_962055977 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
EXI-小洲7 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
2601_961901708 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
QQ_21696290969 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
2601_9621284112 小时前
SpringBoot篇(缓存层)
java·spring boot·缓存
lsz15259013 小时前
深信服AC业务行为审计
审计·深信服·上网行为管理·深信服ac·业务审计·业务行为审计
2601_9620697713 小时前
SpringBoot开发——初步了解SpringBoot
java·spring boot·后端
jay神14 小时前
【计算机毕业设计】基于Spring Boot的宠物领养管理系统
java·spring boot·后端·vue·毕业设计·宠物
2601_9620566014 小时前
可造成敏感信息泄露!Spring Boot之Actuator信息泄露漏洞三种利用方式总结
java·spring boot·后端
码视野14 小时前
基于 Spring Boot + Vue3 的【城市道路地下空洞塌陷微动传感监测与路面脱空沉降预警中台】设计与实现(含PRD/三端高保真源码/大屏)
vue.js·spring boot·后端