当前位置:Java -> 使用JPA、Hibernate和Spring Data JPA审计Spring Boot应用

使用JPA、Hibernate和Spring Data JPA审计Spring Boot应用

在不断发展的软件开发领域中,保持数据完整性、确保安全性,以及满足监管合规要求至关重要。审计(Auditing)是一种精细追踪和记录应用程序中数据和用户操作变化的实践,在实现这些目标方面变得至关重要。在Spring Boot的背景下,这是一种多才多艺的用于构建基于Java的应用程序的框架,审计不仅成为最佳实践,更成为一种必要性。

在这篇全面的指南中,我们将踏上探索Spring Boot应用程序中审计的精妙世界的旅程。我们的重点是利用Java生态系统中三大强者——Java Persistence API(JPA)、Hibernate和Spring Data JPA的综合力量。通过本文,您将拥有实施强大的审计解决方案的知识和工具,可以根据你的Spring Boot项目进行定制。

理解Spring Boot中的审计

审计是软件开发的基本方面,特别是在处理数据驱动应用程序时。它涉及跟踪数据更改、监控用户操作,并保持这些活动的历史记录。在Spring Boot应用程序的背景下,审计在确保数据完整性、安全性和遵守监管要求方面发挥着至关重要的作用。

审计是什么?

从本质上讲,审计涉及记录和监控在软件应用程序中采取的操作。这些操作包括:

  • 创建:跟踪新记录或实体添加到系统的时间。
  • 修改:监控对现有数据(包括更新和修改)的更改。
  • 删除:记录数据何时被移除或标记为已删除的时间。
  • 访问控制:记录谁访问了特定数据以及何时访问。

审计有几个重要用途:

  • 数据完整性:它有助于保持数据一致性,防止未经授权或恶意更改。
  • 安全性:审计有助于识别和应对安全漏洞或可疑活动。
  • 合规性:许多行业和应用程序需要审计以符合法规和标准。
  • 故障排除:通过提供操作的历史记录,简化了识别和解决问题的过程。

JPA审计

JPA没有显式包含审计API,但我们可以通过使用实体生命周期事件来实现此功能。

Java持久化API(JPA)在启用Spring Boot应用程序内的审计方面发挥着关键作用。它引入了实体监听器的概念,这允许您定义方法以响应JPA实体的生命周期事件。对于审计目的,我们特别关注三个关键的生命周期事件:

  • @PrePersist:这个事件发生在实体首次保存到数据库之前,非常适合捕获与创建相关的信息。
  • @PreUpdate:这个事件发生在实体在数据库中更新之前,非常适合跟踪修改。
  • @PreRemove:这个事件发生在实体从数据库中移除之前。

让我们探讨如何有效使用这些事件:

@Entity
public class Product {
    // ...
    
    @PrePersist
    protected void onCreate() {
        // Implement auditing logic here, e.g., setting creation timestamp and user.
    }

    @PreUpdate
    protected void onUpdate() {
        // Implement auditing logic here, e.g., updating modification timestamp and user.
    }
    
    @PreRemove
    protected void onRemove() {
        // Implement auditing logic here, e.g., setting deletion timestamp and user.
    }
}


内部回调方法应始终返回void,不带参数。它们可以有任何名称和任何访问级别,但不应是静态的。

如果我们需要向多个类添加此类审计,可以使用@EntityListeners集中化代码:

@EntityListeners(AuditListener.class)
@Entity
public class Product { ... }
public class AuditListener {
    
    @PrePersist
    @PreUpdate
    @PreRemove
    private void beforeAnyOperation(Object object) { ... }
    
}


使用Hibernate Envers进行审计

为了设置Envers,我们需要将hibernate-envers JAR添加到我们的类路径:

  • Gradle:
dependencies {   
  ...
    implementation 'org.hibernate:hibernate-envers:6.2.4.Final'
  ...
}


  • Maven:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>${hibernate.version}</version>
</dependency>


然后我们在@Entity(以审核整个实体)或特定@Columns上添加@Audited注释(如果仅需要审计特定属性):

@Entity
@AuditTable(value = "au_drone")
public class Drone implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
  
    @NotEmpty
    private String serialNumber;    
   
    private int weightLimit;

    @Audited     
    private int batteryCapacity;
  
  ...
}


@AuditTable是一个可选的注释,它定义了数据库中审核表的名称。在默认情况下,Envers会创建一个名为“tableName_AUD”的审核表。可以在应用程序属性文件中更改所有审核表的审核表后缀(以及其他配置)。

如果不需要对审核实体的字段进行审核,则应使用@NotAudited注释。例如,密码更改对于审计来说并不重要。使用@NotAudited注释,Envers将忽略“password”属性的更改。

@Entity
@Audited
public class User implements Serializable {
	@NotEmpty
    private String login;
      
    @NotEmpty
    private String userName;
    
    @NotAudited
	private String password;
  
  ...
}


您可以使用hibernate.hbm2ddl.auto属性在开发环境中自动创建审核日志表,可选的参数为createcreate-dropupdate

用于审计的Spring Data JPA

Spring Data JPA作为Spring Data项目的一个重要部分,简化了使用JPA的数据库访问,并增强了审计功能。在这一部分中,我们将探讨Spring Data JPA提供的内置审计注释,包括@CreatedBy@CreatedDate@LastModifiedBy@LastModifiedDate。这些注释使您能够轻松地将审计属性整合到您的实体类中,轻松自动化审计处理。

Spring Data JPA注释的作用

Spring Data J

 @CreatedBy@LastModifiedBy

@CreatedBy: 此注解标记实体的创建者字段或属性。

@LastModifiedBy: 它表示最后修改实体的用户。

@Entity
public class Product {
   
    @CreatedBy
    @ManyToOne
    private User createdBy;

    @LastModifiedBy
    @ManyToOne
    private User lastModifiedBy;

    ...
}


在上面的例子中,createdBy 和 lastModifiedBy 与一个User 实体相关联,表示负责创建和最后修改产品实体的用户。

@CreatedDate@LastModifiedDate

@CreatedDate: 此注解捕获实体创建时的时间戳。

@LastModifiedDate: 记录最后修改的时间戳。

@Entity
public class Product {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
	
  ...
}


在这个例子中,createdDate 和 lastModifiedDate 被用来分别存储产品实体的创建时间戳和最后修改时间戳。

启用 Spring Data JPA 审计

要利用 Spring Data JPA 的审计注解,您需要在 Spring Boot 应用中启用审计。按照以下步骤进行:

步骤 1: 添加 @EnableJpaAuditing 注解

在 Spring Boot 应用的主配置类中,添加@EnableJpaAuditing 注解以启用 Spring Data JPA 的审计功能。

@SpringBootApplication
@EnableJpaAuditing
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}


步骤 2: 在实体类中使用审计注解

用相关的 Spring Data JPA 审计注解对您的 JPA 实体类进行注解,就像前面的例子所演示的那样。

启用审计并在实体类中添加适当的注解后,Spring Data JPA 将自动管理审计字段。它将在实体创建和修改时填充这些字段所需的信息。

Spring Data JPA 审计的优点

Spring Data JPA 内置的审计注解提供了几个优势:

  • 简单性: 它们消除了手动实现审计字段和逻辑的需要。
  • 一致性: 这些注解确保了应用程序中审计的标准化方法。
  • 自动化: 审计信息将自动捕获,减少错误的风险。
  • 灵活性: 在需要时,您可以轻松定制审计行为。

结论

在软件开发领域,数据安全、责任和透明性至关重要,审计是一种必不可少的实践。在这个全面的指南中,我们探讨了如何使用 JPA、Hibernate 和 Spring Data JPA 在 Spring Boot 应用程序中实施审计的复杂性。

我们从建立一个 Spring Boot 项目开始,理解了良好结构基础的重要性。然后,我们深入研究了在 JPA 和 Hibernate 中进行审计的核心概念,学习了如何轻松捕获数据更改。

Spring Data JPA 的审计注解被证明是自动化审计流程的强大工具。我们利用这些注解轻松跟踪用户操作、时间戳和修改历史。

推荐阅读: 百度面经(18)

本文链接: 使用JPA、Hibernate和Spring Data JPA审计Spring Boot应用