返回

Spring Boot 数据库审计:记录创建部门的用户 ID

java

在 Spring Boot 中记录创建特定部门的数据库用户 ID

导言

在大型数据库系统中,记录创建、更新和删除操作的元数据至关重要,这有助于提高数据完整性、审计和跟踪。本文探讨如何在 Spring Boot 应用中实现记录创建特定部门的用户 ID,从而为数据库中的审计操作提供必要的信息。

获取用户 ID

获取创建部门的授权用户的 ID 是关键步骤。在 Spring Security 框架中,可以通过 SecurityContextHolder 访问有关当前登录用户的详细信息。本例中,我们使用 AuditorAware 接口,它是一个 Spring Data JPA 提供的回调机制,用于在实体保存之前获取审计信息。

审计信息

审计信息通常包括创建者 ID、创建日期、更新者 ID 和更新日期。为了记录创建部门的用户 ID,我们会在 Department 实体类中添加 @CreatedBy@CreatedDate 注解,如下所示:

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 其他字段

    @CreatedBy
    private Long createUserId;

    @CreatedDate
    private LocalDateTime createDate;

    // 其他字段
}

事件监听器

事件监听器为实体类的生命周期事件(例如持久化)提供了一个切入点。为了在保存 Department 实体时填充审计信息,我们将创建 DepartmentEntityListener,如下所示:

public class DepartmentEntityListener {
    @PrePersist
    public void onPrePersist(Department department) {
        department.setCreateUserId(SecurityContextHolder.getContext().getAuthentication().getPrincipal().getId());
        department.setCreateDate(LocalDateTime.now());
    }
}

注册事件监听器

为了将事件监听器与 Department 实体关联,我们需要在 Spring 配置类中注册它:

@Configuration
public class AuditingConfiguration {
    @Bean
    public AuditorAware<Long> auditorProvider() {
        return new AuditorAwareImpl();
    }

    @Bean
    public HibernateJpaAuditingConfigurer configurer() {
        return new HibernateJpaAuditingConfigurer();
    }
}

实现 AuditorAware 接口

AuditorAware 接口为 @CreatedBy@CreatedDate 注解提供了一个实现,用于获取当前用户的 ID。我们在 AuditorAwareImpl 类中实现了它:

public class AuditorAwareImpl implements AuditorAware<Long> {
    @Override
    public Optional<Long> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.getPrincipal() instanceof UserDetails) {
            return Optional.of(((UserDetails) authentication.getPrincipal()).getId());
        }
        return Optional.empty();
    }
}

业务逻辑

在业务逻辑中,当创建新部门时,该用户 ID 将自动填充到 createUserId 字段中,如下所示:

// 创建部门的业务逻辑
Department department = new Department();
// 设置部门的字段
// ...

departmentRepository.save(department);

结论

通过结合 @CreatedBy@CreatedDate 注解、事件监听器和 AuditorAware 接口的实现,我们能够在 Spring Boot 应用中成功记录创建部门的用户的 ID。这种方法提供了一个全面且可维护的机制,用于跟踪数据库中的审计信息,确保数据完整性和可审计性。

常见问题解答

  1. SecurityContextHolder 适用于哪些类型的应用程序?
    SecurityContextHolder 适用于使用 Spring Security 框架的 Web 和非 Web 应用程序。

  2. 如果用户未登录,会发生什么情况?
    如果用户未登录,则 createUserId 字段将填充为 null 或一个特定的值,具体取决于应用程序的特定要求。

  3. 是否可以记录其他审计信息,例如更新者 ID 和更新日期?
    是的,通过创建额外的 @LastModifiedBy@LastModifiedDate 注解以及相应的事件监听器,可以记录其他审计信息。

  4. 事件监听器只适用于 Department 实体吗?
    不,事件监听器可以注册到任何实体类,允许在其他实体上进行审计信息记录。

  5. 这个解决方案是否也适用于其他框架,如 JPA Hibernate?
    是的,本解决方案适用于使用 JPA Hibernate 的应用程序,因为 HibernateJpaAuditingConfigurer 负责配置 JPA 实体监听器的集成。