环境:SpringBoot2.7.16
1. 为什么要安全审计?
数据变更追踪:审计功能可以记录实体对象的新增、修改、删除操作的时间和操作人。这对于追踪数据的变化非常有用,特别是在需要了解数据历史或回溯数据变更的情况下。
安全性保障:通过审计功能,我们可以追踪到哪些用户进行了哪些操作,以及操作的时间戳等信息。这有助于发现潜在的安全问题或滥用行为,并提供相应的证据用于安全审计和调查。
问题排查和故障恢复:当系统出现问题或故障时,审计记录可以帮助开发人员快速定位和诊断问题的原因。通过查看审计日志,我们可以了解在故障发生前进行了哪些操作,从而加快故障排除和恢复的过程。
合规性和监管要求:在某些行业和法规中,对于数据的变更和访问有严格的合规性和监管要求。审计功能可以帮助组织满足这些要求,提供必要的审计日志和报告,以证明其符合相关法规和标准。
总之,审计功能在Spring Data JPA中提供了对数据变更的追踪和记录能力,有助于保障数据的安全性、进行问题排查和满足合规性要求。
Spring Data JPA为跟踪持久性层的变化提供了很好的支持。通过使用审核,我们可以存储或记录有关实体变更的信息,例如谁创建或更改了实体以及何时进行更改。这种记录可以帮助我们理解和追踪数据的变化过程。
审计功能可以通过以下步骤实现:
在实体类上加上注解@EntityListeners(AuditingEntityListener.class)。
在application启动类中加入注解@EnableJpaAuditing。
在需要审计的字段或方法上加上@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy等注解。这些注解可以指示Spring JPA透明地填充这些字段。
请注意,CreatedBy和LastModifiedBy的赋值需要实现AuditorAware接口来返回你需要插入的值。另外,为了避免在所有实体中重复相同的字段,可以创建一个包含审计相关字段的抽象类,并通过需要审计的实体扩展该抽象类。
2. 实战案例
实体定义
(name = "t_account")public class Account {(strategy = GenerationType.IDENTITY)private Long id ;private String name ;private BigDecimal amount ;private Integer version ;/**创建人*/private String createUser ;/**创建时间*/(TemporalType.TIMESTAMP)// 注:这里可以是JDK8的日期类型,如:Instantprivate Date createTime ;/**最后修改人*/private String lastUpdateUser ;/**最后修改时间*/(TemporalType.TIMESTAMP)private Date lastUpdateTime ;}
如上所示,注解可根据你想要捕获的信息有选择地应用。捕捉更改时间的注解可用于 Joda-Time、DateTime、传统 Java Date and Calendar、JDK8 日期和时间类型以及 long 或 Long 类型的属性。
如果你使用 @CreatedBy 或 @LastModifiedBy,审计基础架构就需要以某种方式了解当前委托人。为此,我们提供一个类,该类实现AuditorAware<T>接口,以便告诉基础架构当前与应用程序交互的用户或系统是谁。泛型 T 定义了注释为 @CreatedBy 或 @LastModifiedBy 的属性的类型。
AuditorAware接口定义
public class OperatorAuditingAware implements AuditorAware<String> {@Overridepublic Optional<String> getCurrentAuditor() {// 这里我们可以通过Spring Security(如果你使用了)SecurityContextHolder获取当前用户// 这里为了简单直接返回用户return Optional.of("pack") ;}}
Spring Data JPA提供了实体监听器可用于触发审计信息的获取通过使用 @EntityListeners 注解在每个实体上启用 AuditingEntityListener,如下所示:
@EntityListeners({AuditingEntityListener.class})public class Customer {}
最后是需要在启动类上添加开启审计功能
@EnableJpaAuditingpublic class ZzzzSbApplication {}
接下来测试
添加操作
@Resourceprivate CustomerRepository cr ;@Testpublic void testSave() {Customer customer = new Customer() ;customer.setAmount(new BigDecimal("6666")) ;customer.setName("张三") ;customer.setVersion(1) ;this.cr.save(customer) ;}
执行结果

四个审计的字段都被自动的填充了值。
更新操作
@Testpublic void testUpdate() {Customer customer = this.cr.findById(1L).orElseGet(() -> new Customer()) ;customer.setId(1L) ;customer.setAmount(new BigDecimal("8888")) ;this.cr.save(customer) ;}
修改OperatorAuditingAware将用户手动修改为其它。
执行结果

最后更新人及更新时间发生了变化。
注:审计功能要求类路径中包含 spring-aspects.jar。
通过以上方式就完成了基本的安全审计功能。
审计功能在Spring Data JPA中发挥着重要的作用,它可以帮助追踪和记录实体对象的新增、修改、删除操作的时间和操作人。这种功能在数据变更追踪、安全性保障、问题排查和故障恢复以及合规性和监管要求等方面具有广泛的应用。
通过使用@EnableJpaAuditing注解和相关注解,如@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy等,可以轻松实现审计功能。这些注解可以指示Spring JPA透明地填充相关字段,从而提供审计所需的详细信息。
完毕!!!



