大数跨境
0
0

追踪数据变化,轻松应对挑战:Spring Data JPA审计功能解析

追踪数据变化,轻松应对挑战:Spring Data JPA审计功能解析 Spring全家桶实战案例
2023-12-18
0
导读:强大而灵活的Spring Data JPA审计功能:提升数据管理和安全性的必备工具

环境:SpringBoot2.7.16



1. 为什么要安全审计?

  1. 数据变更追踪:审计功能可以记录实体对象的新增、修改、删除操作的时间和操作人。这对于追踪数据的变化非常有用,特别是在需要了解数据历史或回溯数据变更的情况下。

  2. 安全性保障:通过审计功能,我们可以追踪到哪些用户进行了哪些操作,以及操作的时间戳等信息。这有助于发现潜在的安全问题或滥用行为,并提供相应的证据用于安全审计和调查。

  3. 问题排查和故障恢复:当系统出现问题或故障时,审计记录可以帮助开发人员快速定位和诊断问题的原因。通过查看审计日志,我们可以了解在故障发生前进行了哪些操作,从而加快故障排除和恢复的过程。

  4. 合规性和监管要求:在某些行业和法规中,对于数据的变更和访问有严格的合规性和监管要求。审计功能可以帮助组织满足这些要求,提供必要的审计日志和报告,以证明其符合相关法规和标准。

总之,审计功能在Spring Data JPA中提供了对数据变更的追踪和记录能力,有助于保障数据的安全性、进行问题排查和满足合规性要求。

Spring Data JPA为跟踪持久性层的变化提供了很好的支持。通过使用审核,我们可以存储或记录有关实体变更的信息,例如谁创建或更改了实体以及何时进行更改。这种记录可以帮助我们理解和追踪数据的变化过程。

审计功能可以通过以下步骤实现:

  1. 在实体类上加上注解@EntityListeners(AuditingEntityListener.class)。

  2. 在application启动类中加入注解@EnableJpaAuditing。

  3. 在需要审计的字段或方法上加上@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy等注解。这些注解可以指示Spring JPA透明地填充这些字段。

请注意,CreatedBy和LastModifiedBy的赋值需要实现AuditorAware接口来返回你需要插入的值。另外,为了避免在所有实体中重复相同的字段,可以创建一个包含审计相关字段的抽象类,并通过需要审计的实体扩展该抽象类。

2. 实战案例

实体定义

@Entity@Table(name = "t_account")public class Account {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id ; private String name ; private BigDecimal amount ; private Integer version ; /**创建人*/ @CreatedBy private String createUser ;  /**创建时间*/ @Temporal(TemporalType.TIMESTAMP) @CreatedDate  // 注:这里可以是JDK8的日期类型,如:Instant private Date createTime ; /**最后修改人*/ @LastModifiedBy private String lastUpdateUser ; /**最后修改时间*/ @Temporal(TemporalType.TIMESTAMP) @LastModifiedDate 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> {
@Override public 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透明地填充相关字段,从而提供审计所需的详细信息。

完毕!!!

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读195
粉丝0
内容832