稽核
基礎知識
Spring Data 提供了精密的支援,以透明地追蹤誰建立或變更了實體以及變更發生的時間。為了從該功能中受益,您必須為您的實體類別配備稽核元數據,這些元數據可以使用註解或實作介面來定義。此外,必須透過註解配置或 XML 配置啟用稽核,以註冊所需的基础架構組件。請參閱特定商店章節以獲取配置範例。
僅追蹤建立和修改日期的應用程式不需要使其本體實作 |
基於註解的稽核元數據
我們提供了 @CreatedBy
和 @LastModifiedBy
來捕獲建立或修改實體的用戶,以及 @CreatedDate
和 @LastModifiedDate
來捕獲變更發生的時間。
class Customer {
@CreatedBy
private User user;
@CreatedDate
private Instant createdDate;
// … further properties omitted
}
如您所見,註解可以有選擇性地應用,具體取決於您要捕獲哪些資訊。指示捕獲何時進行變更的註解可以用於 JDK8 日期和時間類型、long
、Long
和舊版 Java Date
和 Calendar
類型的屬性。
稽核元數據不一定需要存在於根層級實體中,但可以添加到嵌入式實體中(取決於實際使用的商店),如下面的程式碼片段所示。
class Customer {
private AuditMetadata auditingMetadata;
// … further properties omitted
}
class AuditMetadata {
@CreatedBy
private User user;
@CreatedDate
private Instant createdDate;
}
AuditorAware
如果您使用 @CreatedBy
或 @LastModifiedBy
,稽核基礎架構需要以某種方式得知當前主體。為此,我們提供了一個 AuditorAware<T>
SPI 介面,您必須實作該介面以告知基礎架構當前用戶或與應用程式互動的系統是誰。泛型類型 T
定義了使用 @CreatedBy
或 @LastModifiedBy
註解的屬性必須是什麼類型。
以下範例顯示了使用 Spring Security 的 Authentication
物件的介面實作
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
物件的介面實作
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
,您也可以從任何地方查找它。