Oracle® Fusion MiddlewareOracle Adaptive Access Manager開発者ガイド 11gリリース2 (11.1.2.3.0) E67356-01 |
|
前 |
次 |
OAAMのサンプル・アプリケーションには、統合プロセッサとタスク・プロセッサの使用例が示されています。Java API統合の例については、第2章「Oracle Adaptive Access Managerのネイティブ統合」を参照してください。
ここでは、OAAMカスタム・プロセッサ・フレームワークの参考情報を提供します。
OAAMには、ユーザーのビジネス・セキュリティ要件に応えるために、即時利用可能なユーザー・フローやインタフェースが用意されていますが、標準的なWebアプリケーションではユーザーのセキュリティ要件を満たせないことがあります。この場合、OAAMカスタム・プロセッサ・フレームワークを使用して、カスタム開発に対応できます。
図21-1「OAAM標準Webアプリケーション」に、標準のWebアプリケーションを示します。
図21-2「OAAMプロセッサ・フレームワーク」に、このプロセッサ・フレームワークの各種コンポーネントを示します。
参考のため、タスク・プロセッサ統合を示すOAAMサンプル・フレームワークを用意しています。最新のOAAMサンプルは、My Oracle Supportからダウンロードできます。
OAAMサンプル・コードは、ユーザーがタスク・プロセッサ・フレームワークに慣れることを目的としたデモンストレーション用のコードです。このサンプル・アプリケーションは、本番コードでの使用を目的としたものではありません。
注意: このサンプルは、Java API統合用のOAAMサンプル・アプリケーションとは異なります。Java API統合またはタスク・プロセッサ統合を示すOAAMサンプル・アプリケーションのいずれかを使用してください。これら2つのOAAMサンプル・アプリケーションは一緒にデプロイはできません。 |
サンプル・アプリケーションをデプロイするには、次の手順を実行します。
oaam_framework_sample
フォルダを作成します。
oaam_framework_sample.war
をoaam_framework_sample
に抽出します。
WebLogic Serverを起動します。
Oracle WebLogic管理コンソールに移動します。
http://oaam_host
:port
/console
OAAM共有ライブラリ$MW_HOME\Oracle_IDM1\oaam\oaam_libs\war\oaam_native_lib.war
を共有ライブラリとしてデプロイします。
「IAMDomain」(左側のペイン)の下にある「デプロイメント」をクリックします。
「デプロイメントのサマリー」ページで、「インストール」ボタンをクリックします。
「パス」フィールドで、$MW_HOME\Oracle_IDM1\oaam\oaam_libs\war\oaam_native_lib.war
を指定します。
oaam_native_lib.war
を選択して、「次へ」をクリックします。
「このデプロイメントをライブラリとしてインストールする」オプションを選択し、「次へ」をクリックします。
「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。共有ライブラリの名前がoracle.oaam.libs
であることに注意してください。
管理対象サーバーがOAAMサーバーの場合、OAAMデータソースを作成する必要はありません。そうでない場合は、JNDI名jdbc/OAAM_SERVER_DB_DS
のデータソースを作成して、そのデータソースでOAAMスキーマを指定します。
「終了」をクリックします。
「変更のアクティブ化」をクリックします。
OAAM共有ライブラリのデプロイ先である管理対象サーバーに、OAAMサンプル・アプリケーションをアプリケーションとしてデプロイします。
「IAMDomain」(左側のペイン)の下にある「デプロイメント」をクリックします。
「デプロイメントのサマリー」ページで、「インストール」ボタンをクリックします。
「パス」フィールドでOAAMサンプル・アプリケーションの場所を指定して、「次へ」をクリックします。
「このデプロイメントをアプリケーションとしてインストールする」オプションを選択します。「次へ」をクリックします。
「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。
「終了」をクリックします。
「チェンジ・センター」の「変更のアクティブ化」をクリックします。
デプロイメント・ディスクリプタ・ファイルで、OAAM共有ライブラリoracle.oaam.libs
への参照を設定します。
Oracle Adaptive Access Managerの共有ライブラリをWebアプリケーションで使用するには、Oracle WebLogicデプロイメント記述子ファイルweblogic.xml
に次のエントリを追加して、その共有ライブラリを参照する必要があります。
<library-ref> <library-name>oracle.oaam.libs</library-name> </library-ref>
Oracle Adaptive Access Managerの共有ライブラリをエンタープライズ・アプリケーションで使用するには、Oracle WebLogicデプロイメント記述子ファイルweblogic-application.xml
に次のエントリを追加して、その共有ライブラリを参照する必要があります。
<library-ref> <library-name>oracle.oaam.libs</library-name> </library-ref>
管理対象サーバーを起動します。
Oracle WebLogic管理コンソールに移動します。「ロックして編集」をクリックして「デプロイメント」ノードを選択します。「デプロイメントのサマリー」ページで、OAAMサンプル・アプリケーションを検索して選択します。「起動」→「すべてのリクエストを処理」をクリックします。「はい」をクリックして確認します。
OAAM管理アプリケーションにログインし、スナップショットをインポートします。
Sample_Txn_Models.zip
ファイルからトランザクション・ポリシーをインポートします。
URLhttp://managed_server:port/oaam_framework_sample
に移動します。OAAMサンプル・アプリケーションのログイン・ページが表示されます。
次のページで、ユーザー名とパスワードを入力します。登録を行った後、サンプル・トランザクションへのリンクが表示されます。
注意: 最初のログイン時のパスワードはtest である必要があります。このパスワードはすぐに変更してください。 |
UIOContext
は、HTTPリクエスト・オブジェクトとHTTPレスポンス・オブジェクトに対するスレッド・ローカル変数を保守するコンテキスト・オブジェクトです。これにより、アプリケーションのセッション(具体的には、UIOSesisonData
オブジェクト)へのアクセスを常に確保することができます。コンテキストは各要求(HttpServletRequest
およびHttpServletResponse
)の初めに入力する必要があります。
UIOContext.setCurrentInstance(new UIOContext(request, response));
UIOSessionDataオブジェクトはHTTPセッションで維持され、すべてのOAAMセッションとユーザー・データを含んでいます。
インテグレータは、タスク・プロセッサで、重要なOAAM操作を実行するカスタムJavaコードを開発できます。
タスク・プロセッサ:
特定のタスクに対する、一連のOAAM APIコールの実行
OAAMセッション・データの更新
ユーザー・インタフェースをOAAMの「作業」から分離
タスク・プロセッサは通常、エンド・ユーザー・ページと1対1の関係があります。
Login.jsp
ユーザー名のフィールドをユーザーに表示
ユーザー名をloginAction.do
に送信
LoginAction
プレゼンテーションからのデータの受入れ
OAAMタスク・プロセッサへのデータのマップ
LoginTaskProcessor
OAAM APIを呼び出して、UIOSessionDataを更新
「ターゲット」を返す
各タスク・プロセッサ・クラスはTaskProcessorIntf
を実装し、AbstractTaskProcessor
を拡張します。
TaskProcessorIntf
タスク、ターゲット、タスク・パラメータ、およびタスク・アクションの静的変数
メソッドの実行
AbstractTaskProcessor
インタフェース実行メソッドを、次の3つの部分に分類:
preProcess
、process
、postProcess
デフォルト・クラスのpreProcess
メソッドとpostProcess
メソッドは空
カスタマイザが既存のクラスを拡張して、APIコールの前後または結果に基づいてコードを実行可能
validateSession
メソッドを導入することで、ユーザー・セッションが各タスクに有効であることを容易に検証
タスク・アクション(show
/ submit
)を決定するためのユーティリティ・メソッド
プロパティの登録
タスク・プロセッサは、プロパティを使用してシステムに登録されます。タスク・プロセッサのプロパティ定義は次のとおりです。
bharosa.uioappId.task.processor.taskName = java_class
たとえば、次のようになります。
bharosa.uio.default.task.processor.login = com.bharosa.uio.processor.task.LoginTaskProcessor
タスク・プロセッサへのアクセス
タスク・プロセッサは、Utility
メソッドを呼び出すことでアクセスされます。
UIOUtil.getTaskProcessor(UIOSessionData sessionData, String taskId)
パラメータの作成
TaskParams params = new TaskParams(); params.addParam(LoginTaskProcessor.PARAM_LOGIN_ID, loginId); params.setActionSubmit();
タスクの実行
target = taskProc.execute(params).getResult();
各タスク・プロセッサでは、TaskProcessorIntf
インタフェースを実装する必要があります。また、既存のタスク・プロセッサまたはAbstractTaskprocessor
クラスを拡張することをお薦めします。これにより、統合の目的で追加するJavaコードが少量な場合、カスタマイズにpreProcess
やpostProcess
メソッドを組み込むだけで済みます。
たとえば、LogoutTaskProcessor
がコールされるたびに外部APIが必要になる場合は、LogoutTaskProcessor
を拡張するCustomLogoutTaskProcessor
を実装して、外部APIのコールでpostProcess
メソッドのみが実装されるようにできます。その後、新しいCustomTaskProcessor
クラスを指定するようにログアウト・タスク・プロセッサのプロパティを更新できます。
bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.CustomLogoutTaskProcessor
TaskProcessorIntf
の内容は次のとおりです。
public interface TaskProcessorIntf { public static final String TASK_LOGIN = "login"; public static final String TASK_JUMP = "jump"; public static final String TASK_PASSWORD = "password"; public static final String TASK_CHALLENGE = "challenge"; public static final String TASK_CHALLENGE_CHOICE = "challengeChoice"; public static final String TASK_CHANGE_PASSWORD = "changePassword"; public static final String TASK_CHANGE_USERNAME = "changeUsername"; public static final String TASK_FINGERPRINT = "fingerprint"; public static final String TASK_LOGOUT = "logout"; public static final String TASK_FORGOT_PASSWORD = "forgotPassword"; public static final String TASK_CHECKPOINT= "checkpoint"; public static final String TASK_UPDATE_STATUS = "updateStatus"; public static final String TASK_REGISTER_SUMMARY = "registerSummary"; public static final String TASK_REGISTER_IMAGE_PHRASE = "registerImagePhrase"; public static final String TASK_REGISTER_QUESTIONS = "registerQuestions"; public static final String TASK_REGISTER_USER_INFO = "registerUserInfo"; public static final String TASK_REGISTER_COMPLETE = "registerComplete"; public static final String TASK_REGISTER_SKIP = "registerSkip"; public static final String TASK_USERPREF_IMAGE_PHRASE = "userPrefsImagePhrase"; public static final String TASK_USERPREF_QUESTIONS = "userPrefsQuestions"; public static final String TASK_USERPREF_USER_INFO = "userPrefsUserInfo"; public static final String TASK_USERPREF_COMPLETE = "userPrefsComplete"; public static final String TASK_TRANSACTION = "transaction"; public static final String TASK_UPDATE_TRANSACTION_STATUS = "updateTransactionStatus";
public static final String TARGET_ERROR = "error"; public static final String TARGET_SESSION_EXPIRED = "session_expired"; public static final String TARGET_FAIL = "fail"; public static final String TARGET_ACCESS_DENIED = "accessDenied"; public static final String TARGET_INVALID_USER = "invalid_user"; public static final String TARGET_SUCCESS = "success"; public static final String TARGET_UPDATE_STATUS = "updateStatus"; public static final String TARGET_LOGIN = "login"; public static final String TARGET_JUMP = "jump"; public static final String TARGET_PASSWORD = "password"; public static final String TARGET_RESET_PASSWORD = "resetPassword"; public static final String TARGET_CHANGE_PASSWORD = "changePassword"; public static final String TARGET_CHALLENGE= "challenge"; public static final String TARGET_CHALLENGE_CHOICE= "challengeChoice"; public static final String TARGET_FORGOT_PASSWORD = "forgotPassword"; public static final String TARGET_USER_DISABLED = "user_disabled"; public static final String TARGET_NEXT = "next"; public static final String TARGET_ALLOW = Preferences.ACTION_ALLOW; public static final String TARGET_BLOCK = Preferences.ACTION_BLOCK; public static final String TARGET_REGISTER = Preferences.ACTION_REGISTER; public static final String TARGET_REGISTER_SUMMARY = "registerInfo"; public static final String TARGET_REGISTER_IMAGE_PHRASE = "registerAuthenticator"; public static final String TARGET_REGISTER_QUESTIONS = "registerQuestions"; public static final String TARGET_REGISTER_QUESTIONS_HTML = "registerQuestionsHTML"; public static final String TARGET_REGISTER_USER_INFO = "registerUserInfo"; public static final String TARGET_REGISTER_COMPLETE = "registerComplete"; public static final String TARGET_REGISTER_REQUIRED = Preferences.ACTION_REGISTRATION_REQUIRED;
public static final String PARAM_ACTION = "action"; public static final String PARAM_PURPOSE = "purpose"; public static final String ACTION_SUBMIT = "submitAnswer"; public static final String ACTION_WAIT = "wait"; public static final String ACTION_UPGRADE = "upgrade"; public static final String ACTION_DOWNGRADE = "revert"; public static final String ACTION_SHOW = "show"; public static final String PURPOSE_CHANGE_PASSWORD = "ChangePassword"; public static final String PURPOSE_FORGOT_PASSWORD = "ForgotPassword"; public static final String PURPOSE_RESET_PASSWORD = "ResetPassword"; public static final String PURPOSE_EXPIRED_PASSWORD = "ExpiredPassword"; public static final String PURPOSE_USER_PREFERENCES = "UserPreferences"; public static final String PURPOSE_TRANSACTION = "Transaction"; public static final String PURPOSE_JAVASCRIPT = "Javascript"; public TaskResult execute(TaskParams params); }
AbstractTaskProcessor
の内容は次のとおりです。
public abstract class AbstractTaskProcessor implements Serializable, TaskProcessorIntf { public AbstractTaskProcessor() { } public TaskResult execute(TaskParams params) { UIOSessionData sessionData = UIOContext.getCurrentInstance().getSessionData(); if (params == null) params = new TaskParams(); String validateSession = validateSession(); if (validateSession != null) { List errorCodes = null; if (sessionData != null) errorCodes = sessionData.getErrorCodes(); return new TaskResult(validateSession, errorCodes); } String target = preProcess(params); if (!StringUtil.equalsIgnoreCase(target, TARGET_ERROR)){ target = process(params, target); } target = postProcess(params, target); TaskResult result = new TaskResult(target, sessionData.getErrorCodes()); result.setActionList(sessionData.getActionList()); result.setChallengeType(UIOUtil.getCurrentChallengeType(sessionData)); result.setChallengeQuestion(sessionData.getSecretQuestion()); result.setRequestId(sessionData.getRequestId()); result.setLoginId(sessionData.getLoginId()); result.setCurrentAuthDevice(sessionData.getPreferences().getCurrentDevice()); result.setCanSkipRegistration(sessionData.getPreferences().getCanSkipRegistration( )); // Update the sessionData object in session for replication. UIOSessionData.updateSession(); return result; } protected String preProcess(TaskParams params) { return null; } abstract protected String process(TaskParams params, String target); protected String postProcess(TaskParams params, String target) { return target; } protected String validateSession(){ String target = null; UIOSessionData sessionData = UIOContext.getCurrentInstance().getSessionData(); if (sessionData == null){ // Attempt to populate from context. sessionData = UIOContext.getCurrentInstance().getSessionData(); if (sessionData == null){ logger.info("SessionData is not found in session, so the session is expired or UIOContext not pupulated."); return TARGET_SESSION_EXPIRED; } } String customerId = sessionData.getCustomerId(); VCryptAuthUser clientUser = sessionData.getClientAuthUser(); if (clientUser == null && StringUtil.isEmpty(customerId)) { logger.info("Client User is not found in session, so the session is expired."); target = TARGET_SESSION_EXPIRED; } else if (clientUser == null && !StringUtil.isEmpty(customerId)) { logger.info("Client User is not found in session."); target = TARGET_ACCESS_DENIED; } return target; } public boolean isShow(TaskParams params){ return StringUtil.equalsIgnoreCase(params.getAction(), TaskProcessorIntf.ACTION_SHOW); } public boolean isSubmit(TaskParams params){ return StringUtil.equalsIgnoreCase(params.getAction(), TaskProcessorIntf.ACTION_SUBMIT); } public boolean isPurpose(TaskParams params, String purpose){ return params.isPurpose(purpose); } }
パラメータ | 説明 | Purposeの既存の予想/使用される値: | 現在Purposeを使用しているもの: |
---|---|---|---|
Purpose | 同じクラスが複数の類似タスクの処理に使用される場合に、使用されるreasonクラスの区別に使用されます。この場合、(以前にセッションでstrutsパラメータを使用した)一部の動作が変更されることがあります。 | TaskProcessorIntf.PURPOSE_CHANGE_PASSWORD
TaskProcessorIntf.PURPOSE_FORGOT_PASSWORD TaskProcessorIntf.PURPOSE_RESET_PASSWORD TaskProcessorIntf.PURPOSE_EXPIRED_PASSWORD TaskProcessorIntf.PURPOSE_USER_PREFERENCES TaskProcessorIntf.PURPOSE_TRANSACTION TaskProcessorIntf.PURPOSE_JAVASCRIPT |
ChallengeUserTaskProcessor
ChangePasswordTaskProcessor FingerPrintTaskProcessor JumpTaskProcessor UpdateAuthStatusTaskProcessor |
使用方法
setPurpose(String) getPurpose() isPurpose(String) - Tests if current purpose is the provided purpose. - isPurpose(TaskParams, String) is also available in AbstractTaskProcessor for convenience (same functionality)
次のプロパティでは、デフォルトのタスク・プロセッサが定義されます。
bharosa.uio.default.task.processor.login = com.bharosa.uio.processor.task.LoginTaskProcessor bharosa.uio.default.task.processor.jump = com.bharosa.uio.processor.task.JumpTaskProcessor bharosa.uio.default.task.processor.password = com.bharosa.uio.processor.task.PasswordTaskProcessor bharosa.uio.default.task.processor.challenge = com.bharosa.uio.processor.task.ChallengeUserTaskProcessor bharosa.uio.default.task.processor.changePassword = com.bharosa.uio.processor.task.ChangePasswordTaskProcessor bharosa.uio.default.task.processor.changeUsername = com.bharosa.uio.processor.task.ChangeUsernameTaskProcessor bharosa.uio.default.task.processor.fingerprint = com.bharosa.uio.processor.task.FingerprintTaskProcessor bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.LogoutTaskProcessor bharosa.uio.default.task.processor.forgotPassword = com.bharosa.uio.processor.task.ForgotPasswordTaskProcessor bharosa.uio.default.task.processor.checkpoint = com.bharosa.uio.processor.task.CheckpointTaskProcessor bharosa.uio.default.task.processor.updateStatus = com.bharosa.uio.processor.task.UpdateAuthStatusTaskProcessor bharosa.uio.default.task.processor.registerSummary = com.bharosa.uio.processor.task.RegisterSummaryTaskProcessor bharosa.uio.default.task.processor.registerImagePhrase = com.bharosa.uio.processor.task.RegisterImageAndPhraseTaskProcessor bharosa.uio.default.task.processor.registerQuestions = com.bharosa.uio.processor.task.RegisterQuestionsTaskProcessor bharosa.uio.default.task.processor.registerUserInfo = com.bharosa.uio.processor.task.RegisterUserInfoTaskProcessor bharosa.uio.default.task.processor.registerComplete = com.bharosa.uio.processor.task.RegisterCompleteTaskProcessor bharosa.uio.default.task.processor.registerSkip = com.bharosa.uio.processor.task.RegisterSkipTaskProcessor bharosa.uio.default.task.processor.userPrefsImagePhrase = com.bharosa.uio.processor.task.UserPreferencesImageAndPhraseTaskProcessor bharosa.uio.default.task.processor.userPrefsQuestions = com.bharosa.uio.processor.task.UserPreferencesQuestionsTaskProcessor bharosa.uio.default.task.processor.userPrefsUserInfo = com.bharosa.uio.processor.task.UserPreferencesUserInfoTaskProcessor bharosa.uio.default.task.processor.userPrefsComplete = com.bharosa.uio.processor.task.UserPreferencesCompleteTaskProcessor bharosa.uio.default.task.processor.transaction = com.bharosa.uio.processor.task.TransactionTaskProcessor bharosa.uio.default.task.processor.updateTransactionStatus = com.bharosa.uio.processor.task.UpdateTransactionStatusTaskProcessor
*オプションのパラメータです。
表21-1 AbstractTaskProcessor
クラス名 | パラメータ | 結果 | メモ |
---|---|---|---|
LoginTaskProcessor |
LoginTaskProcessor.PARAM_LOGIN_ID LoginTaskProcessor.PARAM_AUTH_STATUS* ユーザー定義列挙: bharosa.uio. |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_ERROR |
ログインIDでユーザーをロードします。 |
JumpTaskProcessor |
JumpTaskProcessor.PARAM_OFFSET JumpTaskProcessor.PARAM_JUMP |
TaskProcessorIntf.TARGET_JUMP TaskProcessorIntf.TARGET_UPDATE_STATUS TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_LOGIN TaskProcessorIntf.TARGET_ERROR |
OAAMセッションを作成します。 ブラウザのフィンガープリント処理を実行します。 認証前ルールを実行します。 |
FingerprintTaskProcessor |
(UIOSesisonDataのFPデータ) |
TaskProcessorIntf.TARGET_SUCCESS |
デジタル・フィンガープリントを処理します(Flashまたはその他の外部フィンガープリント・リクエスト)。デバイス識別プロセッサを使用します。 |
PasswordTaskProcessor |
PasswordTaskProcessor.PARAM_PASSWORD |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_RESET_PASSWORD TaskProcessorIntf.TARGET_INVALID_USER TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR TaskProcessorIntf.TARGET_UPDATE_STATUS |
パスワード送信を処理して、AuthManagerクラスを使用するユーザーを認証します。 |
ChallengeChoiceTaskProcessor |
ChallengeChoiceTaskProcessor.PARAM_CHOICE |
TaskProcessorIntf.TARGET_CHALLENGE TaskProcessorIntf.TARGET_CHALLENGE_CHOICE TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
ユーザーに複数チャレンジ・タイプのオプションが与えられる場合にチャレンジ選択を処理します。 |
ChallengeUserTaskProcessor |
ChallengeUserTaskProcessor.PARAM_ANSWER ChallengeUserTaskProcessor.PARAM_REGISTER_DEVICE |
TaskProcessorIntf.TARGET_CHALLENGE TaskProcessorIntf.TARGET_UPDATE_STATUS TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR |
実行されたチャレンジ・タイプに基づいたチャレンジ・プロセッサ・クラスを使用して、ユーザー・チャレンジを処理します。 |
UpdateAuthStatusTaskProcessor |
UpdateAuthStatusTaskProcessor.PARAM_STATUS UpdateAuthStatusTaskProcessor.PARAM_SECONDARY_GROUP |
(認証後ルール・アクション) TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR |
OAAMのセッション・ステータスを更新します。 |
RegisterSummaryTaskProcessor |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT |
登録サマリーが要求されるときに実行します。(即時利用可能な機能はない) |
. |
RegisterImageAndPhraseTaskProcessor |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
オーセンティケータによる登録を処理します。イメージ、フレーズ、VADアップグレード/ダウングレード。 |
. |
RegisterQuestionsTaskProcessor |
RegisterQuestionsTaskProcessor.PARAM_QUESTION_COUNT RegisterQuestionsTaskProcessor.PARAM_QUESTION_ID_BASE+# RegisterQuestionsTaskProcessor.PARAM_QUESTION_TEXT_BASE+# RegisterQuestionsTaskProcessor.PARAM_QUESTION_ANSWER_BASE+# RegisterQuestionsTaskProcessor.PARAM_REGISTER_DEVICE* |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR |
チャレンジ質問の登録の処理と検証を行います。 |
RegisterUserInfoTaskProcessor |
ユーザー定義列挙によって定義された次の要素です。 bharosa.uio. RegisterUserInfoTaskProcessor.PARAM_REGISTER_DEVICE* RegisterUserInfoTaskProcessor.PARAM_OPTOUT* |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
OTP連絡先情報の登録の処理と検証を行います。 |
RegisterCompleteTaskProcessor |
TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
登録フローの完了後にユーザー登録ステータスを更新します。 |
. |
RegisterSkipTaskProcessor |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
ユーザーが登録をスキップすることを許可されている場合、登録手順をスキップします。 |
. |
UserPreferencesImageAndPhraseTaskProcessor |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
オーセンティケータによる登録を処理します。イメージ、フレーズ、VADアップグレード/ダウングレード。 |
. |
UserPreferencesQuestionsTaskProcessor |
RegisterQuestionsTaskProcessor.PARAM_QUESTION_COUNT RegisterQuestionsTaskProcessor.PARAM_QUESTION_ID_BASE+# RegisterQuestionsTaskProcessor.PARAM_QUESTION_TEXT_BASE+# RegisterQuestionsTaskProcessor.PARAM_QUESTION_ANSWER_BASE+# RegisterQuestionsTaskProcessor.PARAM_REGISTER_DEVICE* |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR |
チャレンジ質問の登録の処理と検証を行います。 |
UserPreferencesUserInfoTaskProcessor |
ユーザー定義列挙によって定義された次の要素です。 bharosa.uio. RegisterUserInfoTaskProcessor.PARAM_REGISTER_DEVICE* RegisterUserInfoTaskProcessor.PARAM_OPTOUT* |
TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
OTP連絡先情報の登録の処理と検証を行います。 |
UserPreferencesCompleteTaskProcessor |
TaskProcessorIntf.TARGET_NEXT TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR |
ユーザー・プリファレンス・フローの完了後にユーザー登録ステータスを更新します。 |
. |
ForgotPasswordTaskProcessor |
ForgotPasswordTaskProcessor.PARAM_PAGEID |
TaskProcessorIntf.TARGET_FORGOT_PASSWORD TaskProcessorIntf.TARGET_SUCCESS TaskProcessorIntf.TARGET_NO_PROXY TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_FAIL |
. |
LogoutTaskProcessor |
TaskProcessorIntf.TARGET_SUCCESS |
ユーザー・セッションをリセットします。 |
. |
CheckpointTaskProcessor |
CheckpointTaskProcessor.PARAM_CHECKPOINT 存在しない場合は、sessionData.getCheckpoint()を使用します。 |
ルール・アクション結果 TaskProcessorIntf.TARGET_SUCCESS |
パラメータとして渡されたチェックポイントまたはsessionDataで設定したチェックポイントを実行し、その結果を返します。 |
ChangePasswordTaskProcessor |
ChangePasswordTaskProcessor.PARAM_PAGEID ChangePasswordTaskProcessor.PARAM_PASSWORD_OLD ChangePasswordTaskProcessor.PARAM_PASSWORD_NEW ChangePasswordTaskProcessor.PARAM_PASSWORD_CONFIRM |
TaskProcessorIntf.SUCCESS TaskProcessorIntf.TARGET_UPDATE_STATUS TaskProcessorIntf.TARGET_CHANGE_PASSWORD TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_ERROR TaskProcessorIntf.TARGET_ERROR |
パスワード・マネージャを使用してユーザー・パスワードを更新します。 |
ChangeUsernameTaskProcessor |
ChangeUsernameTaskProcessor.PARAM_USERNAME_NEW |
TaskProcessorIntf.SUCCESS TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL |
ユーザーのログインIDとユーザー名を更新します。 |
TransactionTaskProcessor |
TransactionTaskProcessor.PARAM_TRANSACTION_TYPE TransactionTaskProcessor.PARAM_CHECKPOINT TransactionTaskProcessor.PARAM_EXTERNAL_TRANSACTION_ID TransactionTaskProcessor.PARAM_AUTO_UPDATE(オプション、falseに設定されている場合はステータスの更新が回避される) TransactionTaskProcessor.CHECKPOINT_NONE(オプション、trueに設定されている場合はチェックポイントの実行が回避される) |
(トランザクション・ルール・アクション) TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR |
トランザクション前処理を実行し、トランザクション・チェックポイントを作成します。 |
UpdateTransactionStatusTaskProcessor |
TransactionTaskProcessor.PARAM_TRANSACTION_TYPE TransactionTaskProcessor.PARAM_CHECKPOINT TransactionTaskProcessor.PARAM_EXTERNAL_TRANSACTION_ID TransactionTaskProcessor.PARAM_STATIUS TransactionTaskProcessor.CHECKPOINT_NONE(オプション、trueに設定されている場合はチェックポイントの実行が回避される) |
(トランザクション・ルール・アクション) TaskProcessorIntf.TARGET_SESSION_EXPIRED TaskProcessorIntf.TARGET_ACCESS_DENIED TaskProcessorIntf.TARGET_FAIL TaskProcessorIntf.TARGET_ERROR |
更新前処理を実行し、トランザクション・チェックポイントを更新します。 |
タスク・プロセッサでは、ユーザー名やパスワードの入力、チャレンジへの応答などのOAAMサーバー・ユーザー・タスクを処理するカスタムJavaクラスの使用が許可されています。
bharosa.uio.default.task.processor.login = com.bharosa.uio.processor.task.LoginTaskProcessor bharosa.uio.default.task.processor.jump = com.bharosa.uio.processor.task.JumpTaskProcessor bharosa.uio.default.task.processor.password = com.bharosa.uio.processor.task.PasswordTaskProcessor bharosa.uio.default.task.processor.challenge = com.bharosa.uio.processor.task.ChallengeUserTaskProcessor bharosa.uio.default.task.processor.challengeChoice = com.bharosa.uio.processor.task.ChallengeChoiceTaskProcessor bharosa.uio.default.task.processor.changePassword = com.bharosa.uio.processor.task.ChangePasswordTaskProcessor bharosa.uio.default.task.processor.changeUsername = com.bharosa.uio.processor.task.ChangeUsernameTaskProcessor bharosa.uio.default.task.processor.fingerprint = com.bharosa.uio.processor.task.FingerprintTaskProcessor bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.LogoutTaskProcessor bharosa.uio.default.task.processor.forgotPassword = com.bharosa.uio.processor.task.ForgotPasswordTaskProcessor bharosa.uio.default.task.processor.checkpoint = com.bharosa.uio.processor.task.CheckpointTaskProcessor bharosa.uio.default.task.processor.updateStatus = com.bharosa.uio.processor.task.UpdateAuthStatusTaskProcessor bharosa.uio.default.task.processor.registerSummary = com.bharosa.uio.processor.task.RegisterSummaryTaskProcessor bharosa.uio.default.task.processor.registerImagePhrase = com.bharosa.uio.processor.task.RegisterImageAndPhraseTaskProcessor bharosa.uio.default.task.processor.registerQuestions = com.bharosa.uio.processor.task.RegisterQuestionsTaskProcessor bharosa.uio.default.task.processor.registerUserInfo = com.bharosa.uio.processor.task.RegisterUserInfoTaskProcessor bharosa.uio.default.task.processor.registerComplete = com.bharosa.uio.processor.task.RegisterCompleteTaskProcessor bharosa.uio.default.task.processor.registerSkip = com.bharosa.uio.processor.task.RegisterSkipTaskProcessor bharosa.uio.default.task.processor.userPrefsImagePhrase = com.bharosa.uio.processor.task.UserPreferencesImageAndPhraseTaskProcessor bharosa.uio.default.task.processor.userPrefsQuestions = com.bharosa.uio.processor.task.UserPreferencesQuestionsTaskProcessor bharosa.uio.default.task.processor.userPrefsUserInfo = com.bharosa.uio.processor.task.UserPreferencesUserInfoTaskProcessor bharosa.uio.default.task.processor.userPrefsComplete = com.bharosa.uio.processor.task.UserPreferencesCompleteTaskProcessor bharosa.uio.default.task.processor.transaction = com.bharosa.uio.processor.task.TransactionTaskProcessor bharosa.uio.default.task.processor.updateTransactionStatus = com.bharosa.uio.processor.task.UpdateTransactionStatusTaskProcessor
OAAMサーバーでは、チャレンジ・メカニズムのカスタム実装を可能にするチャレンジ・プロセッサ・フレームワークが提供されています。
チャレンジ・プロセッサは、ユーザー・チャレンジの生成と検証に使用されます。これらには、外部のチャレンジ・サービスと統合する機能が備わっています。
チャレンジ・プロセッサは、チャレンジに対して次のタスクを実行するために作成できます。
ユーザーに送信するチャレンジ秘密(パスワード)の生成。
ユーザーの回答の検証。
配信の待機ページの制御(必要な場合)。
配信サービスが使用可能かどうかの確認(必要な場合)。
たとえば、SMSを使用するには、秘密のPINを生成し、送信ステータスやクラス(チャレンジ・タイプによってコールされている)のステータスを確認するメソッドを実装する必要があります。
チャレンジ・プロセッサは、ChallengeProcessorIntf
インタフェースを実装するか、AbstractChallengeProcessor
クラスを拡張するJavaコードです。
この項では、実装するチャレンジ・プロセッサのクラスとメソッドについて説明します。参考用に実装例も紹介されています。
チャレンジ・プロセッサを実装するには、次のクラスを拡張する必要があります。
com.bharosa.uio.processor.challenge.AbstractChallengeProcessor
後で、$ORACLE_IDM_HOME\oaam\cli\lib
フォルダのoaam.jarをビルド・クラスパスに追加して、このコードをコンパイルします。
Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。
チャレンジ・プロセッサで使用されるメソッドは、後述の各項で示されています。
表21-2 チャレンジ・プロセッサのメソッド
メソッド | 説明 |
---|---|
protected boolean generateSecret(UIOSessionData sessionData, boolean isRetry) |
このメソッドは、クライアントに送信するコードの生成に使用されます。 |
protected boolean validateAnswer(UIOSessionData sessionData, String answer) |
このメソッドは、ユーザーの回答の検証に使用されます。 |
public String checkDeliveryStatus(UIOSessionData sessionData, boolean userWaiting, boolean isRetry) |
このメソッドは、メッセージが送信されるまで待機させるために使用されます。 |
public boolean isServiceAvailable(UIOSessionData sessionData) |
このメソッドは、外部サービスが使用可能かどうかの確認に使用されます。 |
電子メール・チャレンジ・プロセッサの実装は次のとおりです。
package oracle.oaam.challenge.processor.challenge; import com.bharosa.common.util.*; import com.bharosa.uio.util.UIOUtil; import com.bharosa.uio.util.UIOSessionData; import com.bharosa.common.logger.Logger; import java.io.Serializable; /** * Email Challenge Processor - provides OTP Code generation, delivery and validation */ public class EmailChallengeProcessor extends com.bharosa.uio.processor.challenge.AbstractOTPChallengeProcessor implements Serializable{ static Logger logger = Logger.getLogger(EmailChallengeProcessor.class); public EmailChallengeProcessor( ) { } /** * Generates OTP Code and stores it in sessionData * * @param sessionData data object available for the session * @param isRetry boolean value if method was called as a result of a failed answer attempt * @return */ protected boolean generateSecret(UIOSessionData sessionData, boolean isRety) { String otpCode = sessionData.getOTPCode(); // If no secret code is present in session, generate one. if (StringUtil.isEmpty(otpCode)) { if (logger.isDebugEnabled()) logger.debug("ChallengeEmail generating security code for user: " + sessionData.getCustomerId()); otpCode = generateCode(sessionData); // save the code for later reference - validate / resend sessionData.setOTPCode(otpCode); } if (logger.isDebugEnabled()) logger.debug("OTP code for user " + sessionData.getCustomerId() + " : " + otpCode); if (StringUtil.isEmpty(otpCode)) { logger.error("Email Challenge pin generation returned null."); return false; } // isRetry flag is turned on if user fails to answer the question if (!isRetry) { return sendCode(sessionData); } return true; } /** * Validate user entered answer against value in sessionData * * @param sessionData validate code and return result. * @param answer answer provided by the user * @return */ protected boolean validateAnswer(UIOSessionData sessionData, String answer){ //need to authenticate OTP Code String otpCode = sessionData.getOTPCode(); if (otpCode != null && otpCode.equals(answer)) { // Expire OTP Code sessionData.setOTPCode(null); return true; } return false; } /** * Private methods to send secret code to client * * @param sessionData * @return */ private boolean sendCode(UIOSessionData sessionData){ String otpCode = sessionData.getOTPCode(); try { // UIOUtil.getOTPContactInfo fetches the information registered by the user. Refer to ChallengeEmail.requiredInfo in configuration. String toAddr = UIOUtil.getOTPContactInfo(sessionData, "email"); if (StringUtil.isEmpty(toAddr)) { logger.error("No user email in profile."); return false; } // Send secret code to customer using your email provider } catch (Exception ex) { logger.error("ChallengeEmail Error sending code.", ex); return false; } return true; } public String checkStatus(UIOSessionData sessionData, boolean userWaiting, boolean isRetry) { String target = ChallengeProcessorIntf.TARGET_WAIT; // user already has code, trying again - send to challenge page if (isRetry){ return ChallengeProcessorIntf.TARGET_CHALLENGE; } boolean sendComplete = false; if (userWaiting){ // if secret code is sent set target to target = ChallengeProcessorIntf.TARGET_CHALLENGE; // failed to send target = ChallengeProcessorIntf.TARGET_ERROR; // still processing target = ChallengeProcessorIntf.TARGET_WAIT; } return target; } }
この項では、ユーザーにチャレンジするために使用するチャレンジ・プロセッサの配信チャネル・タイプを定義する手順について説明します。参考用に例が紹介されています。
チャレンジ・タイプは、列挙challenge.type.enum
によって構成されます。実際の列挙値は次のとおりです。
bharosa.uio.application. challenge.type.enum.challenge_type
次に例を示します。
bharosa.uio.default.challenge.type.enum.ChallengeEmail
チャレンジ・タイプ列挙は、チャレンジ・タイプを(そのチャレンジ・タイプの関連作業を実行するために必要な)Javaコードに関連付けるのに使用できます。電子メール・チャレンジ・プロセッサの実装例については、第21.5.2.3項「例: 電子メール・チャレンジ・プロセッサの実装」を参照してください。
チャレンジ・タイプID (ChallengeEmailなど)は、そのチャレンジ・タイプの使用時にルールによって返されるルール・アクションと一致する必要があります。ChallengeEmailのルール・アクションはrule.action.enum.ChallengeEmailです。ルール・アクションとして、電子メールを使用し、かつ電子メールの配信チャネルを使用しているユーザーにチャレンジすることになります。通常、チャネルは、ユーザーへの送信に使用する配信チャネルのことを指します。
チャレンジ・タイプを定義するには、次のプロパティを使用します。
bharosa.uio.default.challenge.type.enum.MyChallenge
プロパティのdefaultはUIOアプリケーション名で、MyChallengeは追加されるチャレンジ・タイプです。次の例のチャレンジ・タイプはChallengeEmailです。
bharosa.uio.default.challenge.type.enum.ChallengeEmail
ルール・アクションとして、電子メールを使用し、かつ電子メールの配信チャネルを使用しているユーザーにチャレンジすることになります。
rule.action.enum.ChallengeEmail
チャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。
bharosa.uio.default.challenge.type.enum.MyChallenge.available = false
表21-3 チャレンジ・タイプのフラグ
プロパティ | 説明 |
---|---|
available |
チャレンジ・タイプが使用可能(サービスが準備され構成されている)かどうか。OTPチャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。 |
processor |
このタイプのチャレンジを処理するためのJavaクラス。 |
requiredInfo |
登録入力列挙からの入力のカンマ区切りリスト。 |
availableフラグの設定は、enabledフラグの設定とは異なります。enabledフラグは、リストから削除してしまいます。
チャネル・タイプの定義の例
bharosa.uio.default.challenge.type.enum属性の値の例は次のとおりです。
bharosa.uio.default.challenge.type.enum.MyChallenge = 1 // unique value to identify Challenge Email in // bharosa.uio.default.challenge.type.enum bharosa.uio.default.challenge.type.enum.MyChallenge.name = MyChallenge // unique string to identify Challenge Email in // bharosa.uio.default.challenge.type.enum, // no spaces bharosa.uio.default.challenge.type.enum.MyChallenge.description = Email Challenge // descriptive name bharosa.uio.default.challenge.type.enum.MyChallenge.processor = oracle.oaam.challenge.processor.challenge.EmailChallengeProcessor // Processor used for sending emails instance of // com.bharosa.uio.processor.challenge.ChallengeProcessorIntf bharosa.uio.default.challenge.type.enum.MyChallenge.requiredInfo = email // comma separated field names, User registration flow captures these data fields, // check Contact information Inputs section to define this enum bharosa.uio.default.challenge.type.enum.MyChallenge.available = false // to turn off this service bharosa.uio.default.challenge.type.enum.MyChallenge.otp = true // indicates this challenge is used for OTP, set it to true
電子メールの例
bharosa.uio.default.challenge.type.enum.ChallengeEmail = 1 bharosa.uio.default.challenge.type.enum.ChallengeEmail.name = Email Challenge bharosa.uio.default.challenge.type.enum.ChallengeEmail.description = Email Challenge bharosa.uio.default.challenge.type.enum.ChallengeEmail.processor = com.bharosa.uio.processor.challenge.EmailUMSOTPChallengeProcessor bharosa.uio.default.challenge.type.enum.ChallengeEmail.requiredInfo = email bharosa.uio.default.challenge.type.enum.ChallengeEmail.displayedInfo = email bharosa.uio.default.challenge.type.enum.ChallengeEmail.available = false bharosa.uio.default.challenge.type.enum.ChallengeEmail.enabled = true bharosa.uio.default.challenge.type.enum.ChallengeEmail.otp=true bharosa.uio.default.challenge.type.enum.ChallengeEmail.otpexpirytimeMs=300000 bharosa.uio.default.challenge.type.enum.ChallengeEmail.htmlLabel=Email Code bharosa.uio.default.challenge.type.enum.ChallengeEmail.htmlInputType=text
SMSの例
bharosa.uio.default.challenge.type.enum.ChallengeSMS = 2 bharosa.uio.default.challenge.type.enum.ChallengeSMS.name = SMS Challenge bharosa.uio.default.challenge.type.enum.ChallengeSMS.description = SMS Challenge bharosa.uio.default.challenge.type.enum.ChallengeSMS.processor = com.bharosa.uio.processor.challenge.SMSUMSOTPChallengeProcessor bharosa.uio.default.challenge.type.enum.ChallengeSMS.requiredInfo = mobile,terms bharosa.uio.default.challenge.type.enum.ChallengeSMS.displayedInfo = mobile bharosa.uio.default.challenge.type.enum.ChallengeSMS.available = false bharosa.uio.default.challenge.type.enum.ChallengeSMS.otp=true bharosa.uio.default.challenge.type.enum.ChallengeSMS.otpexpirytimeMs=300000 bharosa.uio.default.challenge.type.enum.ChallengeSMS.htmlLabel=SMS Code bharosa.uio.default.challenge.type.enum.ChallengeSMS.htmlInputType=text
ユーザー情報プロパティの構成手順は、次の各項で説明されています。
Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。
登録とプリファレンスの入力を有効化するためのデフォルトの構成は次のとおりです。
連絡先情報の登録
bharosa.uio.default.register.userinfo.enabled=false
連絡先情報のプリファレンス
bharosa.uio.default.userpreferences.userinfo.enabled=false
ユーザー情報登録とユーザー・プリファレンスがtrueの場合、入力情報を構成します。
連絡先情報の入力はuserinfo.inputs.enumに定義されています。列挙要素は次のとおりです。
bharosa.uio.application.userinfo.inputs.enum.inputname
表21-4 連絡先入力のプロパティ
プロパティ | 説明 |
---|---|
inputname |
HTML形式の入力フィールドに使用される名前。 |
inputtype |
テキスト入力またはパスワード入力用に設定されます。 |
maxlength |
ユーザー入力の最大長。 |
required |
フィールドが登録ページで必須である場合に設定されます。 |
order |
ユーザー・インタフェースに表示される順序。 |
regex |
このフィールドのユーザー入力を検証するために使用される正規表現。 |
errorCode |
検証エラー・メッセージ(bharosa.uio. |
managerClass |
com.bharosa.uio.manager.user.UserDataManagerIntfを実装するJavaクラス(Oracle Adaptive Access Managerデータベースにデータを格納する場合、このプロパティはcom.bharosa.uio.manager.user.DefaultContactInfoManagerに設定される必要があります)。 |
電子メール入力の例
bharosa.uio.default.userinfo.inputs.enum.email=1 bharosa.uio.default.userinfo.inputs.enum.email.name=Email Address bharosa.uio.default.userinfo.inputs.enum.email.description=Email Address bharosa.uio.default.userinfo.inputs.enum.email.inputname=email bharosa.uio.default.userinfo.inputs.enum.email.inputtype=text bharosa.uio.default.userinfo.inputs.enum.email.maxlength=40 bharosa.uio.default.userinfo.inputs.enum.email.required=true bharosa.uio.default.userinfo.inputs.enum.email.order=2 bharosa.uio.default.userinfo.inputs.enum.email.enabled=true bharosa.uio.default.userinfo.inputs.enum.email.regex= .+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3} bharosa.uio.default.userinfo.inputs.enum.email.errorCode=otp.invalid.email bharosa.uio.default.userinfo.inputs.enum.email.managerClass= com.bharosa.uio.manager.user.DefaultContactInfoManager
デフォルトでは、使用されるチャレンジ・デバイスはルールを使用して構成されています。ルールはAuthentiPadチェックポイントの下に存在し、これにより、デバイスの目的に基づいて使用するデバイスのタイプを指定できます。
注意: Authentipadチェックポイントをバイパスした後、プロパティを使用してどの仮想デバイスを使用するかを決定しても、モバイル・ブラウザでのチャレンジに別のデバイスは使用できません。PinPadやKeyPadなどの一部の仮想デバイスは、モバイル・ブラウザでの使用に適していません。
チャレンジ・タイプを使用するポリシーを作成または更新する手順は次のとおりです。
列挙rule.action.enum
を指定する新しいルール・アクションMyChallenge
を追加します。
新規作成されたアクションMyChallenge
を戻すポリシーを作成して、チャレンジ・メソッドを使用します。
または、プロパティを使用してチャレンジ・デバイスを構成する場合、bharosa.uio.default.use.authentipad.checkpoint
をfalse
に設定して、AuthentiPadチェックポイントをバイパスできます。
チャレンジ・タイプで使用するデバイスを追加できます。
bharosa.uio.application.challengeType.authenticator.device=value
次の例では、チャレンジ・タイプ・キーのChallengeEmail
とChallengeSMS
を使用してプロパティ名を作成しています。
bharosa.uio.default.ChallengeSMS.authenticator.device=DevicePinPad bharosa.uio.default.ChallengeEmail.authenticator.device=DevicePinPad
使用可能なチャレンジ・デバイス値はDeviceKeyPadFull
、DeviceKeyPadAlpha
、DeviceTextPad
、DeviceQuestionPad
、DevicePinPad
およびDeviceHTMLControl
です。
表21-5 認証デバイス・タイプ
プロパティ | 説明 |
---|---|
None |
HTMLページまたは認証パッドはありません。 |
DeviceKeyPadFull |
KeyPadを使用してユーザーにチャレンジします。 |
DeviceKeyPadAlpha |
英数字KeyPad(数字と文字のみで特殊文字は含みません)を使用して、ユーザーにチャレンジします。 |
DeviceTextPad |
TextPadを使用してユーザーにチャレンジします。 |
DeviceQuestionPad |
QuestionPadを使用してユーザーにチャレンジします。 |
DevicePinPad |
PinPadを使用してユーザーにチャレンジします。 |
DeviceHTMLControl |
認証パッドのかわりにHTMLページを使用して、ユーザーにチャレンジします。 |
チェックポイント・プロセッサでは、特定のチェックポイントの実行時にカスタムJavaクラスを実行することが許可されています。このプロパティには次の書式を使用します。
bharosa.uio.appId.checkpoint.processor.checkpoint= fully_qualified_class_name
次のプロパティを使用して、チェックポイント・プロセッサがアプリケーションに登録されます。
bharosa.uio.default.checkpoint.processor.default = com.bharosa.uio.processor.checkpoint.DefaultCheckpointProcessor bharosa.uio.default.checkpoint.processor.preauth = com.bharosa.uio.processor.checkpoint.PreAuthCheckpointProcessor bharosa.uio.default.checkpoint.processor.postauth = com.bharosa.uio.processor.checkpoint.PostAuthCheckpointProcessor bharosa.uio.default.checkpoint.processor.ChallengeUser = com.bharosa.uio.processor.checkpoint.ChallengeCheckpointProcessor bharosa.uio.default.checkpoint.processor.ForgotPassword = com.bharosa.uio.processor.checkpoint.ForgotPasswordCheckpointProcessor bharosa.uio.default.checkpoint.processor.authentiPad = com.bharosa.uio.processor.checkpoint.AuthentiPadCheckpointProcessor
チェックポイント・プロセッサが定義されていない場合、デフォルトのチェックポイント・プロセッサが使用されます。デフォルトのチェックポイント・プロセッサは、同様のプロパティで定義されます。
bharosa.uio.appId.checkpoint.processor.default= fully_qualified_class_name
各チェックポイント・プロセッサでは、CheckpointProcessorIntf
インタフェースを実装する必要があります。
public interface CheckpointProcessorIntf{ public String processCheckpoint(UIOSessionData sessionData, VCryptRulesResult rulesResult); }
各カスタム・チェックポイント・プロセッサでは、DefaultCheckpointProcessor
クラスを拡張することをお薦めします。デフォルトのチェックポイント・プロセッサには、チェックポイントの処理に役立つ便利なメソッドが用意されています。
/** * Default checkpoint handling * * Instanciates and executes appropriatlely configured RulesResultProcessors */ public class DefaultCheckpointProcessor implements CheckpointProcessorIntf{ static Logger logger = Logger.getLogger(DefaultCheckpointProcessor.class); /** * @param sessionData * @param rulesResult * @return */ protected RulesResultProcessorIntf getResultProcessor(UIOSessionData sessionData, VCryptRulesResult rulesResult){ if (rulesResult == null || rulesResult.getResult() == null){ logger.info("getResultProcessor :: Rules Result null - Using default rules result processor."); return getDefaultResultProcessor(sessionData); } String resultName = rulesResult.getResult(); return UIOUtil.getRulesResultProcessor(sessionData, resultName); } /** * @param sessionData * @return */ protected RulesResultProcessorIntf getDefaultResultProcessor(UIOSessionData sessionData){ return UIOUtil.getRulesResultProcessor(sessionData, "default"); } /** * @param checkpointType * @return */ protected String getCheckpointId(int checkpointType){ String checkpointId = null; UserDefEnumElement checkpointElem = UserDefEnum.getElement(BharosaUIOConstants.ENUM_PROFILE_TYPE, checkpointType); if (checkpointElem != null) checkpointId = checkpointElem.getElementId(); return checkpointId; } /** * @param sessionData * @param rulesResult * @return */ public String processCheckpoint(UIOSessionData sessionData, VCryptRulesResult rulesResult){ if (logger.isDebugEnabled()) logger.debug("DefaultCheckpointProcessor::processCheckpoint() entered."); List actionList = rulesResult.getAllActions(); sessionData.setActionList(actionList); RulesResultProcessorIntf rulesResultProcessor = getResultProcessor(sessionData, rulesResult); if (rulesResultProcessor == null){ logger.error("processCheckpoint :: rulesResultProcessor is null."); return Preferences.ACTION_ERROR; } return rulesResultProcessor.processRulesResult(sessionData, rulesResult); } }
ルール結果プロセッサでは、ルール・エンジンによって特定のルール・アクションが返されるときにカスタムJavaクラスを実行することが許可されています。このプロパティには次の書式を使用します。
bharosa.uio.appId. rules.result.processor.rule_action= fully_qualified_class_name
次のプロパティを使用して、ルール結果プロセッサがアプリケーションに登録されます。
bharosa.uio.default.rules.result.processor.default = com.bharosa.uio.processor.rules.result.DefaultRulesResultProcessor bharosa.uio.default.rules.result.processor.Password = com.bharosa.uio.processor.rules.result.PasswordRulesResultProcessor bharosa.uio.default.rules.result.processor.Challenge = com.bharosa.uio.processor.rules.result.ChallengeRulesResultProcessor bharosa.uio.default.rules.result.processor.Register = com.bharosa.uio.processor.rules.result.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegistrationRequired = com.bharosa.uio.processor.rules.result.RegistrationRequiredRulesResultProcessor
ルール結果プロセッサが定義されていない場合、デフォルトのルール結果プロセッサが使用されます。デフォルトのルール結果プロセッサは、同様のプロパティで定義されます。
bharosa.uio.appId. rules.result.processor.default= fully_qualified_class_name
各ルール結果プロセッサでは、RulesResultProcessorIntf
インタフェースを実装する必要があります。
public interface RulesResultProcessorIntf{ public String processRulesResult(UIOSessionData sessionData, VCryptRulesResult rulesResult); }
各カスタム・チェックポイント・プロセッサでは、DefaultRulesResultProcessor
クラスを拡張することをお薦めします。デフォルトのルール結果プロセッサには、ルール結果の処理に役立つ便利なメソッドが用意されています。
/** * Default handling of rule results */ public class DefaultRulesResultProcessor implements RulesResultProcessorIntf{ static Logger logger = Logger.getLogger(DefaultRulesResultProcessor.class); /** * Process rules results, updating user status as defined by VCryptRulesResul object. * * @param sessionData * @param rulesResult * @return */ public String processRulesResult(UIOSessionData sessionData, VCryptRulesResult rulesResult){ if (logger.isDebugEnabled()) logger.debug("DefaultRulesResultProcessor::processRulesResult() entered."); if (rulesResult == null) return null; if (rulesResult.getResult() == null){ if (logger.isDebugEnabled()) logger.debug("DefaultRulesResultProcessor.processRulesResult(): rules result is null."); return Preferences.ACTION_NONE; } Preferences prefs = sessionData.getPreferences(); String ruleAction = rulesResult.getResult(); int authStatus = sessionData.getAuthResult(); int newStatus = authStatus; UserDefEnumElement actionElement = UserDefEnum.getElement(IBharosaConstants.ENUM_RULE_ACTION_ID, ruleAction); String overRideStatus = actionElement.getProperty("authStatus"); if (!StringUtil.isEmpty(overRideStatus)) { if (logger.isDebugEnabled()) logger.debug("Overriding authStatus from action. action=" + ruleAction + ", authSatus=" + overRideStatus); newStatus = Integer.parseInt(overRideStatus); } String device = prefs.getCurrentDevice(); int clientType = UIOUtil.CLIENT_TYPE_LOGIN; if (!StringUtil.isEmpty(device)){ if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_TEXTPAD)) { clientType = UIOUtil.CLIENT_TYPE_TEXTPAD; } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_KEYPAD_FULL) || device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_KEYPAD_ALPHA)) { clientType = UIOUtil.CLIENT_TYPE_KEYPAD; } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_HTML_CONTROL)) { clientType = UIOUtil.CLIENT_TYPE_NORMAL; } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_QUESTIONPAD)) { clientType = UIOUtil.CLIENT_TYPE_QUESTIONPAD; } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_PINPAD)) { clientType = UIOUtil.CLIENT_TYPE_PINPAD; } } sessionData.setClientType(clientType); if (newStatus != authStatus) { //Update tracker if status has changed sessionData.setAuthResult(newStatus); UIOUtil uioUtil = UIOUtil.instance(); try { uioUtil.updateAuthStatus(sessionData, sessionData.getClientType(), newStatus); } catch (BharosaProxyException bpe){ logger.error("Failed to update auth status to " + newStatus + " while processing ruleAction = " + ruleAction, bpe); } } return ruleAction; } }
統合プロセッサを使用すると、OAAM環境内の各アプリケーションにおいて、OAAMユーザー・フローのEntry
、Exit
およびError
ポイントでカスタムJavaコードを開発できます。統合プロセッサでは、AuthManager
、PasswordManager
およびUserDataManager
実装へのアクセスをカスタマイズすることもできます。
この項では、次の項目について説明します。
entry
、exit
およびerror
ポイントにおけるカスタムJavaコードをクライアント側のOAAMコードと統合できます。
public interface IntegrationProcessorIntf extends Serializable { public String onEntry(); public String onExit(String target); public String onError(String target); public String getAppId(); public FlowIntf getFlow(); public AuthManagerIntf getAuthManager(); public PasswordManagerIntf getPasswordManager(); public UserDataManagerIntf getDataManager(String key); }
sessionData
オブジェクトを設定して、共通ユーザー・フローを開始できます。このフローはStartメソッドを実行して開始できます。
表21-6に、即時利用可能なオブジェクトとパラメータを示します。
*オプションのパラメータです。
表21-6 SessionDataオブジェクト
クラス | パラメータ | メモ |
---|---|---|
LoginFlow |
String appId Map<String, String> rulesMap* Hashtable appContext* |
ユーザー名ページとパスワード・ページを表示する標準的なログイン・フロー。フィンガープリント処理、チャレンジおよび登録は必要に応じて実行されます。 |
LoginNoUsernameFlow |
String appId String loginId Map<String, String> rulesMap* Hashtable appContext* |
ログイン・フローに類似していますが、ユーザー名ページをスキップし、指定したユーザー名をかわりに使用します。 |
AuthenticateFlow |
String appId String loginId int authStatus Map<String, String> rulesMap* Hashtable appContext* |
ログイン・フローに類似していますが、ユーザー名ページとパスワード・ページをスキップし、指定したユーザー名と認証ステータスを使用します。 |
ForgotPasswordFlow |
String appId String loginId Map<String, String> rulesMap* Hashtable appContext* |
指定したユーザー名のパスワードを忘れた場合のフローを開始します。フィンガープリント処理およびパスワードを忘れた場合のチェックポイント・ルールがそれぞれ実行され、ポリシーにチャレンジが構成されている場合はユーザーにチャレンジします。 |
UserPreferencesFlow |
String appId String loginId* int authStatus* Map<String, String> rulesMap* Hashtable appContext* |
ユーザー・プリファレンス・フローを開始します。ユーザー・セッションがすでに存在している場合、sessionDataのユーザー名と認証ステータスが使用されます。または、ユーザー名と認証ステータスを指定してユーザー・セッションを作成してから、ユーザー・プリファレンスを表示できます。 |
次のプロパティは、OAAMサーバー・フレームワークのカスタムJavaクラスを登録するために使用されます。
統合プロセッサでは、OAAMサーバーのentry、exitおよびerrorのケースを処理するカスタムJavaクラスの使用が許可されています。
oaam.server.integration.processor.default=com.bharosa.uio.processor.integration. DefaultIntegrationProcessor oaam.server.integration.processor.oam=com.bharosa.uio.processor.integration. OAMIntegrationProcessor oaam.server.integration.processor.mobile=com.bharosa.uio.processor.integration. MobileIntegrationProcessor oaam.server.integration.processor.juniper=com.bharosa.uio.processor.integration. JuniperSSLIntegrationProcessor
認証レベルにおけるOracle Access Management Access Manager固有の統合プロパティは次のとおりです(OAMIntegraitonProcessorクラスで使用される)。
oaam.server.integration.oamauthentication.level.enum=Enum for oam authentication levels provided in tap token oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping=0 oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.name= Mapping oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping. oamauthlevels= -1 to 0, 1 to 99 oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping. oaamauthlevels= 0,1
プロバイダでは、認証およびパスワード管理を処理するカスタムJavaクラスの使用が許可されています。
認証マネージャを使用すると、外部認証サービスとのカスタム統合を実現できます。
認証マネージャのカスタム実装では、com.bharosa.uio.manager.auth.AuthManagerIntf
インタフェースを実装するcom.bharosa.uio.manager.auth.AbstractAuthManager
クラスを拡張する必要があります。認証マネージャはcom.bharosa.uio.manager.auth.AuthResult
オブジェクトを返します。
このプロバイダに任意の数のアプリケーションIDを登録するか、統合プロセッサのgetAuthManager
クラスをオーバーライドすることができます。
カスタム・プロバイダを登録するには、次のプロパティを設定します。
bharosa.uio.default.password.auth.provider.classname = com.bharosa.uio.manager.auth.DummyAuthManager
AbstractAuthManager
はAuthManagerIntf
インタフェースを実装して、ユーザー認証を実行します。
表21-7 AbstractAuthManager
メソッド | 説明 |
---|---|
public AuthResult authenticate(VCryptAuthUser authUser, String password, Hashtable appContext) throws Exception |
内部ロギングを実行し、authenticateUserメソッドをコールします。 |
protected abstract AuthResult authenticateUser(VCryptAuthUser authUser, String password, Hashtable appContext) throws Exception |
UIOSessionDataからOAAMユーザー・オブジェクト、パスワードおよびアプリケーション・コンテキストを取得する抽象メソッド・シグネチャ。このメソッドの実装では、外部認証サービスをコールしてAuthResultオブジェクトを作成してから、そのオブジェクトを戻す必要があります。 |
パスワード・マネージャ・クラスでは、パスワード管理のカスタム処理が実行できます。カスタム・パスワード管理の実装では、com.bharosa.uio.manager.user.PasswordManagerIntf
インタフェースを実装する必要があります。
パスワード・マネージャでは、パスワード変更やパスワード設定のカスタマイズ、およびパスワードの書式要件を示すためにユーザーに対して表示されるパスワード・ポリシー・テキストの取得が可能です。
このプロバイダに任意の数のアプリケーションIDを登録するか、統合プロセッサのgetPasswordManager
クラスをオーバーライドすることができます。OAAMのデフォルトの実装はプレースホルダにすぎないため、実際のパスワード管理は実行されません。
プロパティを使用してカスタム・プロバイダを登録するには、次のように設定します。
bharosa.uio.default.user.management.provider.classname = com.bharosa.uio.manager.user.DefaultPasswordManager
PasswordManagerIntf
は、パスワード・マネージャを実装するためのインタフェースです。
表21-8 PasswordManagerIntf
メソッド | 説明 |
---|---|
public VCryptResponse changePassword(UIOSessionData sessionData, String oldPasswd, String newPasswd, String confirmPasswd) |
既存のパスワードのかわりに新しいパスワードの設定を求める外部サービスのコールを可能にします。パスワードの変更に使用されます。 |
public VCryptResponse setPassword(UIOSessionData sessionData, String password) |
既存のパスワードを必要としない外部サービスのコールを可能にします。パスワードを忘れた場合のフローなど、パスワードのリセットに使用されます。 |
public VCryptObjectResponse<String[]> getPasswordPolicyText(UIOSessionData sessionData) |
パスワード変更またはパスワードのリセットのページで、カスタム・パスワード・ポリシーのテキスト表示を可能にします。ユーザーが確認する必要のある任意のメッセージを設定できますが、本来はユーザーにパスワードの書式と制約を知らせるためのものです。 |
ユーザー・データ・マネージャでは、アクセスのカスタマイズと、携帯電話番号や電子メール・アドレスなどのユーザー・プロファイル・データの管理が可能です。デフォルトでは、OAAMによってOAAMデータベースのユーザー・データが格納および取得されます。ユーザー・データ・マネージャのカスタム実装を使用すると、統合で外部サービスをコールできます。
ユーザー・データで外部サービスを使用する場合、OAAMデータベースで、設定されるユーザー・データの有無を追跡するために使用されるフラグを設定することをお薦めします。
ユーザー・データ・マネージャをカスタマイズするには、com.bharosa.uio.manager.user.DefaultContactInfoManager
クラスを拡張することをお薦めします。このクラスは、com.bharosa.uio.manager.user.UserDataManagerIntf
インタフェースを実装します。
ユーザー・データ・フィールドごとに異なるユーザー・データ・マネージャを使用できます。これにより、必要に応じて各データ要素を別の外部サービスで保持できます。デフォルトでは、すべてのユーザー・データ・フィールドで同一のデータ・マネージャが使用されます。
カスタムのユーザー・データ・マネージャを登録するには、userinfo.inputs
列挙のmanagerClass
プロパティを設定します。
例: bharosa.uio.default.userinfo.inputs.enum.mobile.managerClass=com.bharosa.uio.manager.user.DefaultContactInfoManager
UserDataManagerIntf
は、ユーザー・データを格納または取得するためのユーザー・データ・マネージャ・インタフェースです。
表21-9 UserDataManagerIntf
メソッド | 説明 |
---|---|
public String getUserData(UIOSessionData sessionData, String key) |
キーのユーザー・データ値を取得します。 |
public void setUserData(UIOSessionData sessionData, String key, String value) |
キーのユーザー・データ値を設定します。 |
DefaultContactInfoManager
: ユーザー・データ・マネージャのデフォルトの実装。この実装では、データ値の設定と、値が設定されていることを示すフラグの設定が分割されます。
表21-10 DefaultContactInfoManager
メソッド | 説明 |
---|---|
public String getUserData(UIOSessionData sessionData, String key) |
getUserDataFlagがtrueを戻す場合、getUserDataValueをコールします。 |
public void setUserData(UIOSessionData sessionData, String key, String value) |
キーと値のsetUserDataValueおよびsetUserDataFlagをコールします。 |
protected String getUserDataValue(UIOSessionData sessionData, String key) |
OAAMデータベースから、キーの値を取得します。 |
protected void setUserDataValue(UIOSessionData sessionData, String key, String value) |
OAAMデータベースにキーの値を設定します。 |
protected boolean getUserDataFlag(UIOSessionData sessionData, String key) |
OAAMデータベースで所定のキーのフラグが設定されている場合にtrueを返します。 |
protected void setUserDataFlag(UIOSessionData sessionData, String key, String value) |
ユーザー・データ・キーに対して値が設定されているかどうかを示すフラグを設定します。渡された値が空の場合、フラグが消去されます。 |
レガシー・ルール結果プロセッサでは、10gポリシーがサポートされています。プロパティは次のとおりです。
bharosa.uio.default.rules.result.processor.PasswordTextPadGeneric = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor bharosa.uio.default.rules.result.processor.PasswordTextPad = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor bharosa.uio.default.rules.result.processor.PasswordKeypad = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor bharosa.uio.default.rules.result.processor.PasswordKeypadFull = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor bharosa.uio.default.rules.result.processor.PasswordHTML = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterUserOptionalQuestionPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterUserQuestionPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterUserOptionalTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterUserTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterUser = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterUserOptional = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterQuestionsQuestionPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterQuestionsTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterQuestions = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterImageTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.RegisterImageKeyPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor bharosa.uio.default.rules.result.processor.ChallengeQuestionPad = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor bharosa.uio.default.rules.result.processor.ChallengeSMS = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor bharosa.uio.default.rules.result.processor.ChallengeEmail = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor bharosa.uio.default.rules.result.processor.ChallengeIM = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor bharosa.uio.default.rules.result.processor.ChallengeVoice = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor bharosa.uio.default.rules.result.processor.ChallengeQuestion = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor