当前位置:Java -> 使用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应用程序的背景下,审计在确保数据完整性、安全性和遵守监管要求方面发挥着至关重要的作用。
从本质上讲,审计涉及记录和监控在软件应用程序中采取的操作。这些操作包括:
审计有几个重要用途:
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) { ... }
}
为了设置Envers,我们需要将hibernate-envers JAR添加到我们的类路径:
dependencies {
...
implementation 'org.hibernate:hibernate-envers:6.2.4.Final'
...
}
<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
属性在开发环境中自动创建审核日志表,可选的参数为create
,create-drop
或update
。
Spring Data JPA作为Spring Data项目的一个重要部分,简化了使用JPA的数据库访问,并增强了审计功能。在这一部分中,我们将探讨Spring Data JPA提供的内置审计注释,包括@CreatedBy
,@CreatedDate
,@LastModifiedBy
和@LastModifiedDate
。这些注释使您能够轻松地将审计属性整合到您的实体类中,轻松自动化审计处理。
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 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 内置的审计注解提供了几个优势:
在软件开发领域,数据安全、责任和透明性至关重要,审计是一种必不可少的实践。在这个全面的指南中,我们探讨了如何使用 JPA、Hibernate 和 Spring Data JPA 在 Spring Boot 应用程序中实施审计的复杂性。
我们从建立一个 Spring Boot 项目开始,理解了良好结构基础的重要性。然后,我们深入研究了在 JPA 和 Hibernate 中进行审计的核心概念,学习了如何轻松捕获数据更改。
Spring Data JPA 的审计注解被证明是自动化审计流程的强大工具。我们利用这些注解轻松跟踪用户操作、时间戳和修改历史。
推荐阅读: 百度面经(18)
本文链接: 使用JPA、Hibernate和Spring Data JPA审计Spring Boot应用