資格管理について

この節では、パスワードまわりの処理について説明します。

DefaultCredentialHandler の機能

DefaultCredentialHandler により、パスワード資格の様々な管理を簡単に実現できます。 PasswordCredentialProvider と InternalPasswordCredentialInterceptor コンポーネントを利用して、パスワード検証を柔軟に設定することができます。

PALポータルでは、パスワード資格を扱うために PasswordCredential の実装を提供して、認証に利用しています。

パスワードエンコード

PasswordCredentialProvider から CredentialPasswordEncoder が利用可能であれば、パスワードは保存される前にエンコードされます。 提供している MessageDigestCredentialPasswordEncoder はパスワードの暗号化にメッセージダイジェストのハッシュアルゴリズムを適用します。 たとえば、SHA-1 や Base64 などが利用可能です。

パスワード検証

PasswordCredentialProvider から CredentialPasswordValidator が利用可能であれば、パスワードは保存される前に検証されます。 たとえば、DefaultCredentialPasswordValidator はパスワードを必須にします。 また、SimpleCredentialPasswordValidator は最小の文字列数や最小の数値文字数などを検証することもできます。

InternalCredential では、ライフサイクルイベントで割り込んで検証します。 DefaultCredentialHandler が InternalPasswordCredentialInterceptor で提供されていれば、以下の状況で呼ばれます。

  • 保存場所から資格を読み取った後
  • ユーザー認証した後
  • 新しい資格を保存する前
  • 新しいパスワードを資格に保存する前
PALポータルは、基本的なインターセプターを提供しています。
  • ValidatePasswordOnLoadInterceptor: このインターセプターは保存時にパスワードを検証し、正しくなければ変更を要求します。 それは PasswordCredentialProvider の CredentialPasswordValidator により構成されます。
  • EncodePasswordOnFirstLoadInterceptor: このインターセプターはパスワード保存先から暗号化されていないパスワードを読み取ったときに実行されます。 PasswordCredentialProvider の CredentialPasswordEncoder を使用して、データベースから平文パスワードを初回読み込み時に自動的にエンコードします。
  • PasswordExpirationInterceptor: このインターセプターはパスワードの有効期間を確認します。 それは、InternalCredential の expiration_date と is_expired の値で管理され、期限切れの場合は期限切れフラグを立てます。
  • MaxPasswordAuthenticationFailuresInterceptor: このインターセプターは不正パスワード入力の最大回数を確認して、パスワードハッキングを防ぎます。 最大失敗回数に到達すると、その資格は無効になります。 認証に成功すると、失敗回数はリセットされます。
  • PasswordHistoryInterceptor: このインターセプターは過去にパスワードが利用したものでないかを確認します。 新いパスワードを設定すると、現在のパスワードを FIFO スタックに保存します。 以前に利用したものであれば、PasswordAlreadyUsedException が発生します。

DefaultCredentialHandler は 1 つだけのインターセプターをサポートしています。 しかし、InternalPasswordCredentialInterceptorsProxy を用いることで、複数のインターセプターを利用することができます。

資格管理の実装

DefaultCredentialHandler の実装で利用されるコンポーネントを以下の図に示します。

標準の資格実装では、security_repository.xml で指定される OJB によるマッピングで実現されています。 InternalCredential はSECURITY_CREDENTIAL テーブルにマップされています。 以下が対象部分のデータベーススキーマになります。