監査
基本
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;
}
インターフェースベースの監査メタデータ
アノテーションを使用して監査メタデータを定義したくない場合は、ドメインクラスに Auditable
インターフェースを実装させることができます。すべての監査プロパティの setter メソッドを公開します。
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
に基づいて、どこからでも検索できると想定しています。