メインコンテンツまでスキップ

イベント処理実装ガイド

このドキュメントの目的

SecurityEventとUserLifecycleEventの概要を理解し、詳細ドキュメントへ誘導します。

所要時間

⏱️ 約5分(概要のみ)

前提知識


イベントシステムとは

idp-serverの各種操作(認証・認可・ユーザー管理)で発生するイベントを記録・通知する仕組み。

2種類のイベント:

イベントタイプ目的詳細
SecurityEvent「何が起きたか」を記録・通知認証成功/失敗、トークン発行詳細ガイド
UserLifecycleEvent「ユーザー状態を変更する」アクションアカウントロック、ユーザー削除詳細ガイド

使い分け: SecurityEventは「監視」、UserLifecycleEventは「アクション」


アーキテクチャ概要

両イベントとも同じアーキテクチャパターンを採用:

EntryService - eventPublisher.publish()
↓ (同期)
Spring ApplicationEventPublisher
↓ (同期で即座に返却)
EntryService処理完了 → HTTPレスポンス返却

↓ (非同期 - Spring @EventListener)

EventListener → ThreadPool → EventHandler

└─ ThreadPool満杯時: RetryScheduler.enqueue()

共通のThreadPool設定

設定説明
CorePoolSize5常駐スレッド数
MaxPoolSize10最大スレッド数
QueueCapacity50キュー待機数
RejectedExecutionHandlerカスタム満杯時にRetrySchedulerへ

共通のリトライ戦略

設定
最大リトライ3回
間隔60秒
超過時ログ出力して破棄

詳細ドキュメント

SecurityEvent

目的: 監視・監査(状態変更しない)

認証成功 → SecurityEvent(password_success) → 監査ログに記録 → 外部サービスに通知

内容:

  • 2層のリトライ戦略(イベント処理層 + HTTP層)
  • 主要なイベントタイプ
  • Security Event Hooks
  • データベーススキーマ

👉 SecurityEvent実装ガイド


UserLifecycleEvent

目的: ユーザー状態変更のトリガー

認証失敗5回 → UserLifecycleEvent(LOCK) → User.status = LOCKED → トークン全削除

内容:

  • ライフサイクルタイプ(LOCK/UNLOCK/DELETE等)
  • アカウントロックフロー
  • ユーザー削除戦略(12ステップ)
  • SecurityEventとの連携

👉 UserLifecycleEvent実装ガイド


2種類のイベントの使い分け

パスワード認証失敗の例

1. パスワード認証失敗
→ SecurityEvent(password_failure)発行 ← 監視・記録

2. 失敗回数が5回に到達
→ UserLifecycleEvent(LOCK)発行 ← 状態変更トリガー

3. UserLifecycleEventHandler(非同期)
├─ User.status = LOCKED ← 状態変更
├─ 全OAuthToken削除 ← 状態変更
└─ SecurityEvent(user_locked)発行 ← 記録・通知

ポイント:

  • SecurityEvent: 監視・記録のみ(状態変更しない)
  • UserLifecycleEvent: 状態変更のトリガー
  • 1つのUserLifecycleEventが複数のSecurityEventを発生させることもある

補足: Spring Framework ApplicationEventPublisher

idp-serverのイベントシステムはSpring Frameworkの標準機能を活用しています。

ApplicationEventPublisherとは

Spring Frameworkが提供するイベント駆動アーキテクチャの基盤コンポーネント。

公式ドキュメント:

基本的な使い方

// イベント発行側
@Service
public class EventPublisher {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;

public void doSomething() {
// 同期でイベント発行
applicationEventPublisher.publishEvent(new CustomEvent(this, "data"));
}
}

// イベント受信側
@Component
public class EventListener {

@EventListener
@Async // 非同期実行
public void handleEvent(CustomEvent event) {
// イベント処理
}
}

idp-serverでの活用ポイント

  1. 同期発行 + 非同期処理: イベント発行は同期だが、@Asyncで処理は非同期
  2. 疎結合: EntryServiceはイベント処理の詳細を知らない
  3. スレッドプール制御: AsyncConfigでThreadPool設定を細かく制御

学習リソース


次のステップ

イベント処理の概要を理解したら、詳細ドキュメントへ進んでください:


情報源:

最終更新: 2025-12-13