4.1 ユーザー定義パスワード記憶スキームの実装

Oracle Unified Directory (OUD)のユーザー定義パスワード記憶スキーム・フレームワークは、前述したプラグインAPIの1つと同様のアプローチに従います。ユーザー定義のパスワード記憶スキーム関連のインタフェースおよびクラスは、パッケージoracle.oud.pwdstorageschemeで定義されます。IDE環境の設定方法の詳細は、Oracle® Fusion Middleware Oracle Unified Directory Java APIリファレンスおよびOUDプラグインのデプロイを開始する前に関する項を参照してください。

カスタム・ユーザー定義パスワード記憶スキームでは、汎用Tがoracle.oud.pwdstoragescheme.UserPasswordまたはoracle.oud.pwdstoragescheme.AuthPasswordであるoracle.oud.pwdstoragescheme.ManagedPasswordStorageSchemeインタフェースを実装する必要があります。

簡単に開発できるように、OUD APIには、oracle.oud.pwdstoragescheme.ManagedPasswordStorageSchemeインタフェースを実装する抽象クラスoracle.oud.pwdstoragescheme.AbstractPasswordStorageSchemeが用意されています。

カスタム実装クラスは、oracle.oud.pwdstoragescheme.AbstractPasswordStorageSchemeから拡張できます。実装クラスは、デフォルトのコンストラクタ実装を提供し、パスワードのエンコードおよび検証のための基礎となるロジックを実装するメソッドをオーバーライドする必要があります。

例:

public class CustomUserPasswordHash extends AbstractPasswordStorageScheme<UserPassword>

4.1.1 実装する重要なメソッド

次の重要なメソッドを実装する必要があります:

encodePassword - このメソッドは、サーバーがクリアテキスト・パスワードを暗号化して格納する必要がある場合に起動されます。このメソッドには、ハッシュを実行するカスタム実装コードが含まれている必要があります。この値を維持しながら、Oracle Unified Directory (OUD)はこのエンコードされた値にサーバーに構成されているカスタム・スキームの名前で接頭辞を付けます。

たとえば、{custom1}encoded_valueでは、custom1はOUD構成のユーザー定義パスワード記憶スキームの名前で、encoded_valueはこのメソッドで返される値です。

passwordMatches - このメソッドは、指定されたクリアテキスト・パスワードを検証する必要がある場合に起動されます。

たとえば、ldapbindまたはldapcompare操作中に資格証明を検証します。このメソッドは、この検証を実行するカスタム実装コードが含まれていて、パスワードが一致する場合にのみtrueを返す必要があります。OUDでは、このメソッド呼出しの結果に基づいて認証の成功または失敗の決定が行われます。

initializePasswordStorageSchemeおよびhandleConfigurationChange - サーバーからユーザー定義パスワード記憶スキーム構成を取得するには、これらのメソッドをオーバーライドする必要があります。

これらのメソッドの起動時に、構成を含むPasswordStorageSchemeConfigurationが提供されます。

次の例は、oracle.oud.pwdstoragescheme.PasswordStorageSchemeConfigurationを使用して構成を読み取る方法を示しています。カスタム・スキームで定義できるroundsおよびsaltlengthという2つの構成パラメータがあるとします。カスタム構成インタフェースは次のように表示されます:

例:

publicinterfaceCustomPasswordConfig extendsPasswordStorageSchemeConfiguration {  
   publicintgetRounds() throwsNullPointerException;  
   publicintgetSaltlength() throwsNullPointerException;
}

ユーザー定義スキームの実装内では、前述の2つの構成関連のオーバーライドされたメソッドによって、次の2つのパラメータが読み取られます:

@Override
public void initializePasswordStorageScheme(
final PasswordStorageSchemeConfiguration configuration)
throws PasswordStorageSchemeException {
try {
  super.initializePasswordStorageScheme(configuration);
  CustomPasswordConfig conf = this.getConfiguration(CustomPasswordConfig.class);
  readConfigParams(conf);
} catch (Exception e) {
    getLogger().logError("Error during CustomUserPasswordHash.initializePasswordStorageScheme "
    + e.getMessage());
    throw new PasswordStorageSchemeException(ResultCode.OPERATIONS_ERROR, e);
  }
}
 
@Override
public void handleConfigurationChange(
final PasswordStorageSchemeConfiguration configuration)
throws PasswordStorageSchemeException {
try {
  super.handleConfigurationChange(configuration);
  CustomPasswordConfig conf = this.getConfiguration(CustomPasswordConfig.class);
  readConfigParams(conf);
} catch (Exception e) {
    getLogger().logError("Error during CustomUserPasswordHash.handleConfigurationChange " + e.getMessage());
    throw new PasswordStorageSchemeException(ResultCode.OPERATIONS_ERROR, e);
  }
}
 
private void readConfigParams(CustomPasswordConfig conf) {
  try {
    this.numSaltBytes = conf.getSaltlength();
  } catch (Exception e) {
    getLogger().logDebug(LEVEL.INFO, "Config parameter saltlength not set");
  }
  try {
    this.numRounds = conf.getRounds();
  } catch (Exception e) {
    getLogger().logDebug(LEVEL.INFO, "Config parameter rounds not set");
  }
}

4.1.2 OUDサーバー・ログへの書込み

getLogger()メソッドは、Oracle Unified Directory (OUD)サーバーのログ出力に対するハンドルを提供します。これは、OUDインスタンスの様々なログ・レベルでエラー・ログまたはデバッグ・ログにログ・メッセージを書き込むために使用できます。