ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Adaptive Access Manager開発者ガイド
11gリリース2 (11.1.2)
B71697-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

24 構成可能なアクションの開発

Oracle Adaptive Access Managerには、構成可能なアクションが用意されています。ユーザーはこの機能を使用することにより、チェックポイント実行後に結果アクションまたはリスク・スコアリングあるいはその両方に基づいてトリガーされる新しい補足アクションを作成できます。この項では、構成可能なアクションをOracle Adaptive Access Managerソフトウェアに統合する方法について説明します。

この章では、次の内容を説明します。

24.1 新しい構成可能なアクションの追加

新しい構成可能なアクションを追加するには、次のタスクを実行します。

  1. Javaインタフェースcom.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicActionを実装して、構成可能なアクションを開発します。


    注意:

    この手順では、実装とは、Javaインタフェースcom.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicActionで指定されている規定に基づいてJavaコードを記述することです。


    Javaインタフェースcom.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicActionの実装時には、次の2つのメソッドをコーディングする必要があります。

    • getParameters(): このメソッドでは、構成可能なアクションで使用されるパラメータを戻すためのコードを記述する必要があります。返されるパラメータ配列のサイズが、パラメータの数と同じであることを確認してください。

    • execute(): このメソッドでは、構成可能なアクションで必要とされるロジックを実行するコードを記述する必要があります。構成可能なアクションのパラメータ値は、actionParamValueMapで渡されます。ここで、パラメータ名はキーで、RuntimActionParamValueオブジェクトは値になります。適切なgetXXXValue()メソッドを使用して、パラメータ値を取得します。

  2. JARファイルを$ORACLE_IDM_HOME\oaam\cli\libフォルダからビルド・クラスパスに追加して、Oracle Adaptive Access Managerクラスを拡張または実装するカスタムJavaクラスをコンパイルします。

  3. 構成可能なアクションの実装を詳細にテストします。

    構成可能なアクションはスタンドアロンJavaクラスであるため、JUnitフレームワークのユニット・テスト方法を使用してテストできます。

    構成可能なアクションをテストするためのサンプルJUnitコードについては、第24.4項「サンプルJUnitコード」を参照してください。

  4. Javaクラスをコンパイルし、コンパイル済クラス・ファイルのJARファイルを作成します。

  5. Oracle Adaptive Access Managerを拡張またはカスタマイズして、カスタムJARファイルを追加します。Oracle Adaptive Access ManagerへのカスタムJARファイルの追加手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

  6. OAAMサーバーとOAAM管理サーバーを再起動します。

  7. OAAM管理にログインし、新しくデプロイされた構成可能なアクションのアクション定義エントリを作成します。

  8. 構成可能なアクションに必要なすべてのパラメータがユーザー・インタフェースに表示されていることを確認します。

  9. 新しく使用可能になった構成可能なアクションを必要なチェックポイントに追加して使用します。構成可能なアクションの構成方法については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

24.2 構成可能なアクションの特定の順序での実行およびデータ共有

構成可能なアクションを使用してチェーンを実装する際には、


注意:

構成可能なアクション間でデータを共有するにはJavaコードを記述する必要があるため、単純な構成作業よりも労力を要します。


構成可能なアクションを特定の順序で実行してデータを共有する手順は次のとおりです。

  1. 構成可能なアクションを同期アクションとして構成し、昇順で実行されるようにします。


    注意:

    構成可能なアクションは、トリガー基準が満たされる場合にのみ実行されます。そのため、トリガー基準が間違っていないことを確認してください。


  2. データを共有するには、構成可能なアクションのexecute()メソッドのactionContextMapパラメータに対象データを挿入します。actionContextMapMapであるため、共有されるデータを表すキーと値のペアが必要になります。


    注意:

    実装者は次の点に留意する必要があります。

    • データ挿入に重複するキーが使用されていないこと。

    • この共有データを別の構成可能なアクションからアクセスする場合でも同じキーが使用されること。


  3. actionContextMapにキーが存在しないケースもコードで処理されることを確認します。他のアクションがactionContextMapに値を挿入しない場合にエラーまたはNullPointerExceptionが発生しないよう、この手順を実行する必要があります。

24.3 構成可能なアクションのトリガーのテスト方法

構成可能なアクションがトリガーしていることをテストする手順は次のとおりです。

  1. 構成可能なアクションのコードの実行を識別する方法があることを確認します。ログ・ファイルまたはデータベースの1つのエントリを参照するという単純な確認で十分です。

  2. OAAMサーバーで、oracle.oaamロガーに対してデバッグ・レベルのログを有効にします。

  3. 特定の構成可能なアクションのアクション・テンプレートを作成します。

  4. 認証前チェックポイントにアクションを追加します。この際、トリガー基準を0から1000のスコアとして指定します。

  5. OAAMサーバーにユーザーとしてのログインを試みます。

  6. OAAMサーバーのログで、エントリEnter: executeAction(): Executing Action Instanceを確認します。

  7. エラーがない場合は、Exit: executeAction(): Action Instanceのような関連するログ文が表示されます。

  8. エラーがある場合は、Error: executeAction()のようなログ文が表示されます。

  9. さらに、構成可能なアクションによって作成されたログ・エントリやデータベース・エントリを確認します。

24.4 サンプルのJUnitコード

動的アクションをテストするためのサンプルJUnitコードを次に示します。

public class TestDynamicActionsExecution extends TestCase {
        static Logger logger = Logger.getLogger(TestDynamicActionsExecution.class);
        private DynamicAction caseCreationAction = null;
 
 
        public void setUp()throws Exception {
                caseCreationAction = new CaseCreationAction();
    }
 
        public void testDynamicAction() {
 
                //RequestId
                String requestId = "testRequest";
 
                //Request Time
                Date requestTime = new Date();
 
                //Map that contains values passed to the rule/model execution
                Map ruleContextMap = new HashMap();
 
                //Result from rule execution
                VCryptRulesResultImpl rulesResult = new VCryptRulesResultImpl();
                rulesResult.setResult("Allow");
                rulesResult.setRuntimeType(new Integer(1));
 
                //Configurable action's parameter values
                Map actionParamValueMap = new HashMap();
                RuntimeActionParamValue caseTypeParamValue = new
 RuntimeActionParamValue();
                caseTypeParamValue.setIntValue(CaseConstants.CASE_AGENT_TYPE);
 
                RuntimeActionParamValue caseSeverityParamValue = new
 RuntimeActionParamValue();
                caseSeverityParamValue.setIntValue(1);
 
                RuntimeActionParamValue caseDescriptionParamValue = new
 RuntimeActionParamValue();
                caseDescriptionParamValue.setStringValue("Testing CaseCreation
 Action");
 
                //ActionContext Map for passing data to/from the dynamic action
 execution
                Map actionContextMap = new HashMap();
 
                //Execute the action
                try {
                        caseCreationAction.execute(requestId, requestTime,
 ruleContextMap, rulesResult, actionParamValueMap, actionContextMap);
                }catch(Exception e) {
                        Assert.fail("Exception occurred while executing dynamic
 action");
                        logger.error("Exception occcurred while executing dynamic
 action", e);
                }
 
                //Write appropriate asserts to check if the configurable action
 has executed properly
        }
 
    public void tearDown() throws Exception {
 
    }
}

24.5 構成アクション用のサンプルのJavaコード

この項では、構成可能なアクション用のサンプル・コードを示します。

public class HelloWorldAction implements DynamicAction {
 
     private UserDefEnum valueTypeEnum = UserDefEnum.getEnum("value.type.enum");
 
     public boolean execute(String sessionId, Date requestTime,
 
               Map ruleContextMap, VCryptRulesResult ruleResult,
 
               Map actionParamValueMap, Map actionContextMap) throws Exception {
 
           // TODO Auto-generated method stub
 
            System.out.println("Hello World!!");
 
            return false;
 
      }
 
 
 
     public DynamicActionParamInfo[] getParameters() {
 
         DynamicActionParamInfo params[] = new DynamicActionParamInfo[3];
 
 
 
         String paramName = "Sample Integer Parameter";
 
         String description = "Integer Parameter Description";
 
         String notes = "Integer Parameter Notes";
 
         String promptLabel = "Integer Parameter";
 
         int valueType = valueTypeEnum.getElementValue("int");
 
         String defaultValue = "1";
 
 
 
         params[0] = new DynamicActionParamInfo();    
              
 
         params[0].setParamName(paramName);
 
         params[0].setPromptLabel(promptLabel);
 
         params[0].setNotes(notes);
 
         params[0].setDescription(description);
 
         params[0].setValueType(valueType);
 
         params[0].setDefaultValue(defaultValue);
 
                              
 
         paramName = "Sample String Parameter";
 
         description = "String Parameter Description";
 
         notes = "String Parameter Notes";
 
         promptLabel = "String Parameter";
 
         valueType = valueTypeEnum.getElementValue("string");
 
         defaultValue = "Sample String value";
 
                              
 
         params[1] = new DynamicActionParamInfo();    
              
 
         params[1].setParamName(paramName);
 
         params[1].setPromptLabel(promptLabel);
 
        params[1].setNotes(notes);
 
        params[1].setDescription(description);
 
        params[1].setValueType(valueType);
 
        params[1].setDefaultValue(defaultValue);
 
 
 
 
 
        paramName = "Sample Boolean Parameter";
 
        description = "Boolean Parameter Description";
 
        notes = "Boolean Parameter Notes";
 
        promptLabel = "Boolean Parameter";
 
        valueType = valueTypeEnum.getElementValue("boolean");
 
        defaultValue = "true";
 
        params[2] = new DynamicActionParamInfo();    
              
 
        params[2].setParamName(paramName);
 
        params[2].setPromptLabel(promptLabel);
 
        params[2].setNotes(notes);
 
        params[2].setDescription(description);
 
        params[2].setValueType(valueType);
 
        params[2].setDefaultValue(defaultValue);
                                return params;
 
     }
 
}