稽核

基礎

Spring Data 提供精密的支援,以透明地追蹤誰建立或變更了實體,以及變更發生的時間。為了受益於此功能,您必須為您的實體類別配備稽核元數據,這些元數據可以使用註解或實作介面來定義。此外,必須透過註解組態或 XML 組態啟用稽核,以註冊所需的基礎架構組件。請參考特定於儲存區的章節以取得組態範例。

僅追蹤建立和修改日期的應用程式不需要使其應用程式實體實作 AuditorAware

基於註解的稽核元數據

我們提供 @CreatedBy@LastModifiedBy 以捕捉建立或修改實體的用戶,以及 @CreatedDate@LastModifiedDate 以捕捉變更發生的時間。

已稽核的實體
class Customer {

  @CreatedBy
  private User user;

  @CreatedDate
  private Instant createdDate;

  // … further properties omitted
}

如您所見,註解可以選擇性地應用,具體取決於您想要捕捉的資訊。指示捕捉何時進行變更的註解可以用於 JDK8 日期和時間類型、longLong 和舊版 Java DateCalendar 類型的屬性。

稽核元數據不一定需要存在於根層級實體中,但可以添加到嵌入式實體中(取決於實際使用的儲存區),如下面的程式碼片段所示。

嵌入式實體中的稽核元數據
class Customer {

  private AuditMetadata auditingMetadata;

  // … further properties omitted
}

class AuditMetadata {

  @CreatedBy
  private User user;

  @CreatedDate
  private Instant createdDate;

}

基於介面的稽核元數據

如果您不想使用註解來定義稽核元數據,您可以讓您的網域類別實作 Auditable 介面。它公開了所有稽核屬性的 setter 方法。

AuditorAware

如果您使用 @CreatedBy@LastModifiedBy,稽核基礎架構需要以某種方式得知當前的主體。為此,我們提供了一個 AuditorAware<T> SPI 介面,您必須實作該介面以告知基礎架構誰是當前與應用程式互動的用戶或系統。泛型類型 T 定義了使用 @CreatedBy@LastModifiedBy 註解的屬性必須是什麼類型。

以下範例顯示了介面的實作,該實作使用 Spring Security 的 Authentication 物件

基於 Spring Security 的 AuditorAware 實作
class SpringSecurityAuditorAware implements AuditorAware<User> {

  @Override
  public Optional<User> getCurrentAuditor() {

    return Optional.ofNullable(SecurityContextHolder.getContext())
            .map(SecurityContext::getAuthentication)
            .filter(Authentication::isAuthenticated)
            .map(Authentication::getPrincipal)
            .map(User.class::cast);
  }
}

此實作存取 Spring Security 提供的 Authentication 物件,並查找您在 UserDetailsService 實作中建立的自訂 UserDetails 實例。我們在此假設您透過 UserDetails 實作公開網域用戶,但根據找到的 Authentication,您也可以從任何地方查找它。

ReactiveAuditorAware

當使用反應式基礎架構時,您可能想要利用上下文資訊來提供 @CreatedBy@LastModifiedBy 資訊。我們提供了一個 ReactiveAuditorAware<T> SPI 介面,您必須實作該介面以告知基礎架構誰是當前與應用程式互動的用戶或系統。泛型類型 T 定義了使用 @CreatedBy@LastModifiedBy 註解的屬性必須是什麼類型。

以下範例顯示了介面的實作,該實作使用反應式 Spring Security 的 Authentication 物件

基於 Spring Security 的 ReactiveAuditorAware 實作
class SpringSecurityAuditorAware implements ReactiveAuditorAware<User> {

  @Override
  public Mono<User> getCurrentAuditor() {

    return ReactiveSecurityContextHolder.getContext()
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(User.class::cast);
  }
}

此實作存取 Spring Security 提供的 Authentication 物件,並查找您在 UserDetailsService 實作中建立的自訂 UserDetails 實例。我們在此假設您透過 UserDetails 實作公開網域用戶,但根據找到的 Authentication,您也可以從任何地方查找它。