プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Privileged Account Managerの管理
11gリリース2 (11.1.2.3)
E61951-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

18 Oracle Privileged Account Manager用のプラグインの開発

この章では、Oracle Privileged Account Manager用に自身のプラグインを開発する方法について説明します。


注意:

プラグインの構成およびデプロイ方法などOracle Privileged Account Managerのプラグインの管理の基本情報は、第13項「プラグインの使用」を参照してください。

この章では、次の項目について説明します。

18.1 概要

Oracle Privileged Account ManagerのJavaベースのプラグイン・フレームワークを使用して自身固有のビジネスおよび技術要件に対応するようにOracle Privileged Account Managerの機能を拡張するプラグインを作成できます。プラグインによって、トランザクション内にカスタム・ロジックを提供することや、カスタム・データ・ソースに接続することができます。

この項の内容は次のとおりです。

18.1.1 Oracle Privileged Account Managerフレームワーク・パッケージ

Oracle Privileged Account Managerプラグイン・フレームワークには、プラグインの実装の開発に必要なプラグイン・インタフェースおよびクラスが含まれています。このフレームワークは、次のJARファイルに付属しています。

ORACLE_HOME/opam/jlib/opam-plugin-framework.jar

このjarファイルを使用してプラグインを開発、実装およびコンパイルできます。


注意:

Oracle Privileged Account Manager用のプラグインの開発に関する追加情報は、第13.2項「Oracle Privileged Account Manager用のプラグインの開発」を参照してください。

18.1.2 Oracle Privileged Account Managerのプラグインの使用に関する特別な考慮事項

次に、プラグインの開発時に考慮する必要があるいくつかの特別な考慮事項および依存関係を示します。

  • プラグインの開発時にOracle Privileged Account Managerサーバー・ランタイムは必要ありませんが、このサーバー・ランタイムはデプロイメントおよびテスト目的で必要です。

18.2 プラグインの設定

Oracle Privileged Account Manager Javaプラグインを設定する手順は、次のとおりです。

  1. 事前定義済インタフェースを使用してスタンドアロンJavaプログラムを作成し、必要なメソッドを実装します。

    操作の「前」または「後」のタイミングを使用してプラグインを実行できます。対応するpreプラグインまたはpostプラグイン・インタフェースを実装する必要があります。


    注意:

    これらのタイミングの説明は、第13.2.7.1項「操作前プラグイン」および第13.2.7.2項「操作後プラグイン」を参照してください。

  2. コンパイル前に、次のjarをクラスパスに配置します。

    ORACLE_HOME/opam/jlib/opam-plugin-framework.jar
    
  3. プラグインJavaファイルをコンパイルし、classまたはjarファイルを作成します。コンパイルがエラーなしで完了していることを確認します。

  4. Oracle Privileged Account Managerサーバーからアクセス可能なファイル・システムの場所にそのclassまたはjarファイルを配置します。高可用性クラスタ構成のために、個別の各ノードまたはすべてのノードからアクセス可能な共有の場所にclassまたはjarファイルを配置できます。

  5. プラグイン構成エントリを追加することでプラグインを登録します。


注意:


classおよびjarファイルに任意の名前およびパッケージを選択できます。ただし、プラグインを登録する際は、Plug-in Class NameおよびPlug-in Class Path属性の構成時と同じ名前とパッケージを使用する必要があります。

たとえば、my.sample.OpamPluginなどの完全修飾名を使用してプラグインを作成し、それを/u01/myplugin.jarファイルにコンパイルし、かつそれが/u01/myutils.jarのいくつかのクラスに対して依存関係を持っている場合、そのプラグイン構成では次のものを使用する必要があります。

プラグインのクラス名 プラグインのクラスパス
my.sample.OpamPlugin /u01/myplugin.jar

/u01/myutils.jar


プラグイン構成が登録されて有効化された後は、起動条件が満たされるたびにサーバーによってそのプラグインが起動されます。

18.3 プラグインAPIの理解

この項では、プラグインAPIの高度な概要、およびメイン・クラスやインタフェースの役割を説明します。


注意:

プラグインの実装ではSystem.exit()を使用しないでください。それによってサーバー・ランタイムに障害が発生することがあります。

この項の内容は次のとおりです。

18.3.1 サーバーとプラグイン間の通信

Oracle Privileged Account Managerプラグインは、PrePluginまたはPostPluginインタフェースを使用してOracle Privileged Account Managerサーバーと通信します。プラグインの起動時には、サーバーによつてPluginContextオブジェクトが作成され、操作に関する詳細(ターゲット、アカウントなど)が、その操作によって起動されるプラグインに渡されます。また、サーバーによって、操作リクエスト本文およびプラグインを起動するプラグイン構成も、そのプラグインに渡されます。

プラグインにより、PluginResultオブジェクトが構成されます。タスクが完了すると、プラグインによりPluginResultオブジェクトがサーバーに戻されます。PluginResultオブジェクトには、成功または失敗のコード、カスタム・エラー・メッセージおよびログ・メッセージを含めることもできます。場合によっては、プラグインは詳細を変更したり、リクエスト本文に追加し、それらの詳細をサーバーに戻すこともできます。

次の図では、Oracle Privileged Account Managerのプラグインがサーバーと通信方法を示します。

図18-1 プラグインとサーバーの通信方法

プラグインとサーバーの通信方法を示す図

18.3.2 プラグインの構造

Javaプラグインの一般的な構造は、次のとおりです。

preプラグインの場合

public class OPAM_PLUGIN_CLASSNAME implements PrePlugin {
    public void runPrePlugin(PluginContext ctx, String reqBodyJSON, String pluginCfgJSON) {
       // Plugin Code
   }
}

postプラグインの場合

public class OPAM_PLUGIN_CLASSNAME implements PostPlugin {
    public void runPostPlugin(PluginContext ctx, String reqBodyJSON, String pluginCfgJSON) {
       // Plugin Code
   }
}

18.3.3 プラグイン・インタフェースとクラス


注意:

詳細は、Oracle Privileged Account Managerプラグイン・フレームワークJava APIリファレンスを参照してください。

この項では、Oracle Privileged Account Managerに対して使用するプラグイン・インタフェースおよびクラスについて説明します。

この項の内容は次のとおりです。

18.3.3.1 PlugInContext

Oracle Privileged Account Managerサーバーは、プラグインの起動中にPluginContextオブジェクトを作成し、それをそのプラグインに送信します。このオブジェクトには、次の情報が格納されます。

  • JSON形式のアカウント情報getAccountJSON()メソッドを使用することで取得されます。

    • アカウント情報は、アカウントに関係する操作(checkincheckoutなど)に存在します。

    • アカウント情報は、ターゲットの追加や削除などアカウントに関係ない操作には存在しません。また、アカウント情報は、新しいアカウントを追加する場合も、アカウントがまだ作成されていないために存在しません。クライアントによって送信される詳細は、リクエスト本文JSONで取得できます。


    注意:

    アカウント・リソースおよびそのJSON形式の詳細は、付録B「Oracle Privileged Account ManagerのRESTfulインタフェースの使用」第B.7項「アカウント・リソース」を参照してください。

  • JSON形式のターゲット情報getTargetJSON()メソッドを使用することで取得されます。

    (前述の) JSON形式のアカウント情報と同様に、ターゲット情報は、ターゲットが関係する操作にのみ存在します。


    注意:

    ターゲット・リソースおよびそのJSON形式の詳細は、付録B「Oracle Privileged Account ManagerのRESTfulインタフェースの使用」第B.6項「ターゲット・リソース」を参照してください。

  • JSON形式の操作情報getOperationJSON()メソッドを使用することで取得されます。

    このメソッドには、この操作がどのリソースに対して実行されるのか(ターゲット、アカウントなど)に関する情報が含まれます。また、どの操作が実行されるのか(adddeleteなど)に関する情報も含まれます。例:

    {
    "resourceType":"account",
    "operationName":"add"
    }
    
  • JSON形式の認証情報getAuthContextJSON()メソッドを使用することで取得されます。

    このメソッドには、どのユーザーが操作を実行するのかおよびそのユーザーがどのグループのメンバーなのかに関する情報が含まれます。次に例を示します。

    {
    "requestor":"johndoe",
      "requestorGroups":["ITADMINS", "MANAGERS"]
    }
    

    この情報は、リソース・タイプserverの操作には存在しません。その操作はエンド・ユーザーではなくOracle Privileged Account Managerサーバーによって実行されるためです。

  • PluginResultオブジェクト。情報をサーバーに戻すためにプラグインによって作成されます。このオブジェクトはsetPluginResult()メソッドを使用して設定し、設定された値を取得するにはgetPluginResult()メソッドを使用します。


    注意:

    PluginResultオブジェクトの詳細は、第18.3.3.2項「PluginResult」を参照してください。

  • HTTPレスポンスのステータス (postプラグインのみ)。getHTTPResponseStatus()メソッドを使用することで取得されます。

    postプラグインの場合に、Oracle Privileged Account ManagerサーバーREST APIベースの操作が完了すると、操作レスポンス・コード(200 OK、401 Unauthorizedなど)がプラグインに送信されます。

  • HTTPレスポンスのエンティティ (postプラグインのみ)。getHTTPResponseEntity()メソッドを使用することで取得されます。


    注意:

    このエンティティは、カスタム資格証明ストアを更新するためにカスタム・プラグインを書き込む必要がある場合に便利です。これは、このメソッドがOracle Privileged Account Managerによって変更されたアカウント名およびパスワードを返すためです。

    postプラグインの場合に、Oracle Privileged Account ManagerサーバーREST APIベースの操作が完了すると、操作結果がプラグインに送信されます。たとえば、操作結果には、検索操作によるアカウントのリスト(JSON形式)、checkout操作によるアカウント・トークン(JSON形式)などが含まれることがあります。

    "accountpasswordchange"イベントに対するサーバー上のpostタイミングのHR_ADMINアカウント用のJSONの例を次に示します。

    {
    "accountToken":
    {"accountName":"HR_ADMIN",
    "accountUID":"ea75011d2ed48154a17d101cdb52c7b4",
    "accountPassword":"password"
    }
    }
    
  • HTTPレスポンスの場所→作成されたGUID (postプラグインのみ)。gettHTTPResponseLocation()→getGuid()メソッドを使用することで取得されます。

    postプラグインおよびadd操作の場合に、Oracle Privileged Account ManagerサーバーREST APIベースのadd操作が完了すると、新しく作成されたエンティティのGUIDがプラグインに送信されます。このGUIDは、作成操作の場合にのみ存在します。GUIDは、ターゲットの削除、ターゲットの変更などの操作の場合には存在しません。

18.3.3.2 PluginResult

プラグインによってPluginResultが作成され、それを使用して、Oracle Privileged Account Managerサーバーに情報が送り返されます。

このオブジェクトを作成するために、プラグインはPluginResult(java.lang.String resultJSON,int plgErrorCode,java.lang.String plgErrorMsg)メソッドを使用します。作成後、PluginResultを、サーバーによって送信されたPluginContextに格納することで、サーバーに戻します。次に例を示します。

PluginResult result = new PluginResult(resultJSON, plgErrorCode, plgErrorMsg);
ctx.setPluginResult(result);

PluginResultオブジェクトには、次の情報が含まれます。

  • プラグインによって変更されたリクエスト本文JSON。JSON形式の結果情報。

    • preプラグイン操作では、プラグインはこの情報を使用して、それに渡されたリクエスト本文JSON内の詳細を変更したり追加し、更新済コンテンツを結果JSONとして返します。サーバーは、操作を実行する前に、その結果のJSONを使用して、リクエスト本文JSONを置き換えます。

      複数のpreプラグインが同じ操作に対して実行される場合、各プラグインは、それらの実行順序に基づいて更新されたリクエスト本文を取得します。最後のpreプラグインが実行された後、最終的なリクエスト本文が使用されてサーバー内でその操作が実行されます。

      プラグインでリクエスト本文JSONを変更しない場合、そのままプラグイン結果JSONに渡すことができます。プラグインは、PluginResultオブジェクトの作成時にこの値を設定でき、getResultJSON()およびsetResultJSON()メソッドを使用してそれにアクセスできます。

    • postプラグイン操作では、プラグインはこの値を読み取ることができますが、この値を変更しても何も影響を与えません。それはその操作がすでに完了しているためです。

  • エラー・コード。成功(PluginResult.CODE_SUCCESS)または失敗(PluginResult.CODE_FAILURE)を指定します。

    プラグインは、PluginResultオブジェクトの作成中にこの値を設定でき、getErrorCode()およびsetErrorCode()メソッドを使用してそれにアクセスできます。

  • エラー・メッセージ。障害発生時にエラーについて説明します。

    プラグインは、任意の文字列メッセージを設定し、それをクライアントに戻すことができます。プラグインは、PluginResultオブジェクトの作成中にメッセージを設定でき、getPlgErrorMsg()およびsetErrorMs()メソッドを使用してそれにアクセスできます。

    たとえば、checkout操作に対して、チェックアウト日付を検証してその地域の休日や週末などブラックリストに載せられた日におけるアカウントの使用を防止するpreプラグインを構成したとします。このプラグインはチェックアウトに対してCheckout is not allowed on holidays.などのエラー・メッセージを設定できます。この場合、checkout操作は失敗し、それにはエラー・メッセージPlug-in execution failed with error message: Checkout is not allowed on holidays.が含まれるようになります。

  • デバッグ・ロギング。プラグインの実行に関する情報を提供します。

    プラグインは、ログ・メッセージをサーバーに送り返すことができ、それはサーバー・ログ・ファイルに記録されます。これらのログを使用して、プラグインの実行をデバッグできます。このログ・メッセージには、getLog()appendLog(String)およびclearLog()メソッドを使用することでアクセスできます。

18.3.3.3 PrePlugin

Oracle Privileged Account Managerの操作用のpreプラグインを作成するには、PrePluginインタフェースを実装する必要があります。PrePluginインタフェースを実装するには、次のメソッドを使用します。

void runPrePlugin(PluginContext ctx, java.lang.String reqBodyJSON, java.lang.String pluginCfgJSON)

次の情報が、runPrePluginメソッドを介してサーバーからpreプラグインに渡されます。

  • PluginContextオブジェクト。操作に関する詳細が格納されます。

    詳細は、第18.3.3.1項「PlugInContext」を参照してください。

  • リクエスト本文JSON。クライアントによってOracle Privileged Account Managerに送信されるREST API操作のリクエストを提供します。

    プラグインは、この情報をpreプラグイン用に変更でき、新しく更新されたJSONをPluginResultオブジェクトでサーバーに送り返すことができます。詳細は、第18.3.3.2項「PluginResult」を参照してください。

  • プラグイン構成。JSON形式でこの操作を起動します。

    同じJavaプラグイン実装を多数の操作に使用できます。たとえば、電子メール通知を実行する同一のプラグインをcheckoutcheckinの両方の操作に対して実行できます。

    プラグイン構成がプラグインに渡されると、それによって、その構成によって起動されるプラグインに詳細が提供されます。これは、構成内に存在するカスタム属性をプラグインに渡す場合にも役立ちます。たとえば、電子メール通知の場合、プラグイン構成のカスタム属性としてメール・サーバー詳細を格納でき、それらはプラグインに渡されます。

18.3.3.4 PostPlugin

Oracle Privileged Account Managerの操作用のpostプラグインを作成するには、PostPluginインタフェースを実装する必要があります。PostPluginインタフェースを実装するには、次のメソッドを使用します。

void runPostPlugin(PluginContext ctx, java.lang.String reqBodyJSON, java.lang.String pluginCfgJSON)

runPostPluginメソッドを介してサーバーからpostプラグインに渡される情報は、前の項で説明した情報と同じです。 第18.3.3.3項「PrePlugin」のリストを確認してください。

18.3.3.5 プロパティ・ファイル

プラグインでは、入力パラメータをプラグイン構成からプラグイン実装に渡すために使用されるカスタム属性をサポートしています。これらの属性名はプラグインの開発者によって定義されるので、それぞれの値とともに管理者が手動で構成する必要があります。この処理を簡単にするため、プロパティ・ファイルを使用して、属性の名前と値を定義します。

開発者は、定義済のプラグインにちなんだ名前の.propertiesファイルを作成して、それを.jarファイル内にパッケージ化できます。たとえば、プラグインの名前が"my.sample.OpamPlugin"の場合、.propertiesファイルは"my.sample.OpamPlugin.properties"と名付けられます。propertiesファイルは、コンパイルされたプラグイン.jarファイルのルート・フォルダ内にパッケージする必要があります。

.propertiesファイル内には、カスタム属性のリストおよび次の情報をプラグインごとに定義することが可能です。

  • デフォルト値

  • カスタム属性の構成が必須かどうか

  • カスタム属性の値のマスクが必要かどうか

管理者は、プラグインの構成時に.propertiesファイルをロードできます。プラグイン用の.propertiesファイルがある場合は、次のように処理されます。

  • コンソールの「ロード」ボタンを使用して、カスタム属性のデフォルト値をプラグイン構成にロードできます。詳細は、第13.3項「プラグイン構成の作成」の手順5を参照してください。

  • プラグインの必須カスタム属性は、.propertiesファイル内で定義済としてチェックされます。

  • カスタム属性値は、.propertiesファイルで定義されているとおりにマスクされます。

examplePlugin.jar内にあるexamplePlugin.propertiesという名前のサンプル.propertiesファイルのスニペットを次に示します。


注意:

次のスニペットで定義されているnamedefaultmaskおよびrequiredプロパティは必須です。これらのプロパティに空白値を指定する場合は、値を=""として構成する必要があります。

<customattribute>
    <name value="email"/>
    <default value="abc@efg.com"/>
    <mask value="false"/>
    <required value="true"/>
  </customattribute>
  <customattribute>
    <name value="day"/>
    <default value=["Saturday,Sunday"]/>
    <mask value="false"/>
    <required value="false"/>
  </customattribute>

18.4 プラグインのデバッグとロギング

プラグインは、独自のログ・ファイルを保持し、そのファイルにリアルタイムで記録することが可能です。さらに、プラグインは、第18.3.3.2項「PluginResult」に示すように、PluginResultオブジェクト・デバッグ・ロギング・メソッドを使用して、実行中にOracle Privileged Account Managerサーバーのログ・ファイルにデバッグ・メッセージを記録できます。

PluginResultメソッドを使用して記録されたメッセージは、Oracle Privileged Account Managerサーバー・ログ・ファイルに格納されます。これらのメッセージを表示するには、ロギング・レベルをTRACE:32 (非常に詳細なトレースまたはデバッグ情報)に設定する必要があります。

次の例は、プラグインのロギング機能の実装に使用されるサンプル・コードを示しています。

例18-1 プラグイン・ロギングの実装に使用されるサンプル・コード

public void runPostPlugin(PluginContext ctx, String reqBodyJSON, 
String pluginCfgJSON) { // the parameters are the same for runPrePlugin()
…
  PluginResult result = ctx.getPluginResult(); // get the PluginResult object 
    from PluginContext object
  result.appendLog("Here is the log");  // append log
…
  // System.out.println(result.getLog()); // getLog() will return current log
  // result.clearLog(); // clearLog() will remove the log that has been recorded
…
}

18.5 プラグインの例

この項では、次の例について説明します。

18.5.1 preプラグインの例

例18-3は、操作が実行される前に、指定された日付に基づいて操作をブロックするpreプラグインを示しています。

組織によっては、特権アカウントへのアクセスが許可されない日付(地域の休日、例年の休業など)が記載されたブラックリストを保持していることがあります。このpreプラグインは、検証を実行し、Oracle Privileged Account Managerの使用ポリシー機能を拡張します。

この節では、以下のトピックについて説明します。

18.5.1.1 preプラグインの構成

プラグインの属性を定義して、特定のアクションを実行するように構成できます。次の表に示す属性を使用してプラグインを構成します。

属性名 属性値
pluginName BlackListDates
pluginStatus active
pluginResource アカウント
pluginOperation checkout
pluginTiming pre
pluginOrder 1
pluginClassName BlackListDates
pluginClassPath /myhome/plugins/BlackListDates.jar
pluginCustomAttrs dateカスタム属性を使用して、1つ以上のブラックリスト日付を指定します。
次に例を示します。
  • date: 10/01

  • date: 06/30

pluginTimeout 60

このプラグインは、次のカスタム属性を使用してブラックリストに載せられた日付を指定します。

属性名 属性値
date 月/日、たとえば、10/01です。

注意:

  • 複数のdate属性を指定できます。

  • プラグインのサンプルで使用されているゼロ(0)を無視しないでください。
    たとえば、6月9日をブロックするには、6/9ではなく06/09と指定する必要があります。


オプションで、この項の手順を実行して、プロパティ・ファイルを使用することでpreプラグインのカスタム属性を構成します。プロパティ・ファイルが定義されている場合は、プラグイン構成の作成中にロード・ボタンを使用してプロパティをロードできます。プロパティ・ファイルが定義されていない場合は、プラグイン構成の作成中にカスタム属性を手動で入力できます。

プロパティ・ファイルを使用してカスタム属性を構成する手順:

  1. "BlackListDates.class"ファイルが含まれる同じフォルダ内に"BlackListDates.properties"というファイルを作成します。

  2. "date"属性のデフォルト値を定義します。

  3. .propertiesファイルを保存します。

例18-2「ブラックリスト日付のpreプラグイン・プロパティ・ファイルのカスタム属性」はこの.propertiesファイルのサンプル・コンテンツを示しています。

例18-2 ブラックリスト日付のpreプラグイン・プロパティ・ファイルのカスタム属性

 <customattribute>
    <name value="date"/>
    <default value=["10/01,12/01"]/>
    <mask value="false"/>
    <required value="true"/>
  </customattribute>
  <customattribute>
    <name value="version"/>
    <default value=["1.0.0"]/>
    <mask value="false"/>
    <required value="false"/>
  </customattribute>

18.5.1.2 preプラグインのコンパイル

preプラグインを構成した後はコンパイルする必要があります。この項の手順を実行してそれを行います。

  1. 必要に応じて、次のファイルをダウンロードします。

    ダウンロード元: ダウンロードするファイル
    ORACLE_HOME
    • opam-plugin-framework.jar
    • jettison-1.3.jar

    • jersey-bundle-1.18.jar

    • jsr311-api.jar


  2. 次のサンプル・コンパイル・コマンドを使用します。

    javac -cp .:ORACLE_HOME/opam/jlib/opam-plugin-framework.jar:
    ORACLE_HOME/opam/jlib/third-party/jettison-1.3.jar:
    ORACLE_HOME/opam/jlib/third-party/jersey-bundle-1.18.jar:
    ORACLE_HOME/opam/jlib/third-party/jsr311-api.jar
    BlackListDates.java
    
  3. JARファイルを作成します。

    jar -cf BlackListDates.jar BlackListDates.class BlackListDates.properties
    

Oracle Privileged Account Managerに対してこのプラグインを構成すると、プラグインは、date属性に基づいてユーザーによるOracle Privileged Account Managerの操作の実行をブロックします。たとえば、今日が10/01であり、date属性の1つが10/01である場合、ユーザーはこの操作を実行できません。


注意:

次の例では、月と日のみが必要です。年は無関係です。

例18-3 ブラックリストに載せられた日付のpreプラグイン

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.json.JSONStringer;
import org.codehaus.jettison.json.JSONArray;
 
import com.oracle.idm.opam.plugin.interfaces.PrePlugin;
import com.oracle.idm.opam.plugin.context.PluginContext;
import com.oracle.idm.opam.plugin.context.PluginResult;
 
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
public class BlackListDates implements PrePlugin {
 
public void runPrePlugin(PluginContext ctx, String reqBodyJSON, String pluginCfgJSON){
  System.out.println("===== In BlackListDates.runPrePlugin =====");
  try {
    JSONArray blackDates = null; 
    JSONObject plugin = new JSONObject(pluginCfgJSON);
    JSONObject config = plugin.getJSONObject("plugin");
    JSONArray customAttrsArr = new JSONArray();
    if(config.has("pluginCustomAttrs"))
      customAttrsArr = config.getJSONArray("pluginCustomAttrs");
    for(int i=0; i<customAttrsArr.length(); i++) {
      JSONObject singleJSON = customAttrsArr.getJSONObject(i);           
      JSONObject singleAttr = singleJSON.getJSONObject("pluginCustomAttr");
      String attrName = singleAttr.getString("attrname");   
    if(attrName.equalsIgnoreCase("date"))
      blackDates = singleAttr.getJSONArray("attrvalue");
    }
 
    for(int i=0; i<blackDates.length(); i++) {
      String date = blackDates.getString(i);
      String[] count = date.split("/");
      if(count.length != 2)      // wrong format, ignore
        continue;
      else {
        if(isToday(date)) {
          setResult(ctx, reqBodyJSON, PluginResult.CODE_FAILURE,
 "You are not allowed to do the operation on this date : " + date);
         return;
        }
      }
     }
   }
  catch (Exception e) {
    System.out.println("Exception happened: ");
    e.printStackTrace();
    PluginResult ret = new PluginResult(reqBodyJSON, PluginResult.CODE_FAILURE, e.getMessage());
    ctx.setPluginResult(ret);
  }
  System.out.println("===== Finished BlackListDates.runPrePlugin =====");
}
private static boolean isToday(String blackDate) {
  DateFormat dateFormat = new SimpleDateFormat("MM/dd");
  Date date = new Date();
  if( blackDate.equalsIgnoreCase( dateFormat.format(date).toString() ) )
    return true;
  else
    return false;
 }
private static void setResult(PluginContext ctx, String reqBodyJSON, int resultCode, String msg) {
  PluginResult ret = new PluginResult(reqBodyJSON, resultCode, msg);
  ctx.setPluginResult(ret);
  return;
}
 
}

18.5.2 postプラグインの例

例18-4は、操作が完了した後に、操作に関する電子メールを送信するpostプラグインを示しています。

この節では、以下のトピックについて説明します。

18.5.2.1 postプラグインの構成

プラグインの属性を定義して、特定のアクションを実行するように構成できます。次の表に示す属性を使用してプラグインを構成します。

属性名 属性値
pluginName EmailNotification
pluginDescription This is an Email Notification Plug-in.
pluginResource アカウント
pluginOperation checkout
pluginTiming post
pluginOrder 1
pluginClassName EmailNotificationPlugin

注意: クラス名は、自身のプラグインJARファイル内のクラス名と一貫している必要があります。

pluginClassPath /myhome/plugins/EmailNotificationPlugin.jar

注意: pluginClassPathは複数値属性であるため、JSONは、次に示すようなJSON配列形式で送信する必要があります。

pluginClassPath: ["/myhome/plugins/EmailNotificationPlugin.jar"]
pluginCustomAttrs 次のカスタム属性を使用して、電子メールの送信に使用するSMTPサーバー、電子メールが送信されるアドレスなどの情報を送信します。
  • smtp_server: SMTPホスト名

  • smtp_port: 25

  • to_addr: to_address@somedomain

  • from_addr: from_address@somedomain


電子メールの送信に使用するSMTPサーバー、電子メールが送信されるアドレスなどの情報を送信するために次のカスタム属性を構成することも必要です。

属性名 属性値
smtp_server SMTPホスト名
smtp_port 25
to_addr <EMAIL ADDRESS>

注意: 複数の値を設定できます。必要に応じて、任意の数のto_addrおよび値を入力します。

from_addr <EMAIL ADDRESS>
user オプションです。SMTPログイン・ユーザー名
password オプションです。SMTPログイン・ユーザー・パスワード

このプラグインはJAVA Mail APIを使用して電子メールを送信します。JAVA Mailライブラリの詳細およびライブラリのダウンロードは、次のリンクを参照してください。

http://www.oracle.com/technetwork/java/javamail/index.html

オプションで、この項の手順を実行して、プロパティ・ファイルを使用することでpostプラグインのカスタム属性を構成します。プロパティ・ファイルが定義されている場合は、プラグイン構成の作成中にロード・ボタンを使用してプロパティをロードできます。プロパティ・ファイルが定義されていない場合は、プラグイン構成の作成中にカスタム属性を手動で入力できます。

プロパティ・ファイルを使用してカスタム属性を構成する手順:

  1. "EmailNotificationPlugin.class"ファイルが含まれる同じフォルダ内に"EmailNotificationPlugin.properties"というファイルを作成します。

  2. "date"属性のデフォルト値を定義します。

  3. .propertiesファイルを保存します。

例18-4「電子メール通知のpostプラグイン・プロパティ・ファイル」はこの.propertiesファイルのサンプル・コンテンツを示しています。

18.5.2.2 postプラグインのコンパイル

postプラグインを構成した後はコンパイルする必要があります。この項の手順を実行してそれを行います。

  1. 必要に応じて、次のファイルをダウンロードします。

    ダウンロード元: ダウンロードするファイル
    ORACLE_HOME
    • opam-plugin-framework.jar
    • jettison-1.3.jar

    • jersey-bundle-1.18.jar

    • jsr311-api.jar

    JAVA Mail API mail.jar

  2. 次のサンプル・コンパイル・コマンドを使用します。

    javac -cp .:ORACLE_HOME/opam/jlib/opam-plugin-framework.jar:
    ORACLE_HOME/opam/jlib/third-party/jettison-1.3.jar:
    ORACLE_HOME/opam/jlib/third-party/jersey-bundle-1.18.jar:
    ORACLE_HOME/opam/jlib/third-party/jsr311-api.jar:.
    /javax.mail.jar EmailNotificationPlugin.java
    
  3. JARファイルを作成します。

    jar -cf EmailNotificationPlugin.jar EmailNotificationPlugin.class EmailNotificationPlugin.properties
    

Oracle Privileged Account Managerに対してこのプラグインを構成すると、プラグインは、構成済の操作が実行されるたびに、カスタム属性に設定されているアドレスに電子メールを送信します。たとえば、アカウント・リソース・タイプおよびチェックアウト操作に対してこのプラグインを構成すると、プラグインは、チェックアウトが完了するたびに電子メール通知を送信します。

例18-4 電子メール通知のpostプラグイン・プロパティ・ファイル

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.json.JSONStringer;
import org.codehaus.jettison.json.JSONArray;
 
import com.oracle.idm.opam.plugin.interfaces.PostPlugin;
import com.oracle.idm.opam.plugin.context.PluginContext;
import com.oracle.idm.opam.plugin.context.PluginResult;
import java.lang.Thread;
import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
/* Sample post plugin that sends email notification */
public class EmailNotificationPlugin implements PostPlugin {
 
    public void runPostPlugin(PluginContext ctx, String reqBodyJSON,
                              String pluginCfgJSON) {
 
        PluginResult result =
            new PluginResult(reqBodyJSON, PluginResult.CODE_SUCCESS, null);
 
        try {
 
            result.appendLog("Starting EmailNotificationPlugin");
 
            /* Get the resource type and operation name from the context */
            JSONObject opJSON = new JSONObject(ctx.getOperationJSON());
            String resourceType = opJSON.getString("resourceType");
            String operationName = opJSON.getString("operationName");
 
            /* Get the target name */
            JSONObject json = null;
            String targetName = null;
            if (ctx.getTargetJSON() != null) {
                JSONObject targetJSON = new JSONObject(ctx.getTargetJSON());
                json = targetJSON.getJSONObject("target");
                targetName = json.getString("targetName");
            }
 
            /* Get the account name */
            String accountName = null;
            if (ctx.getAccountJSON() != null) {
                JSONObject accountJSON = new JSONObject(ctx.getAccountJSON());
                json = accountJSON.getJSONObject("account");
                accountName = json.getString("accountName");
            }
 
            /* Get which user performed the operation */
            JSONObject pluginAuthJSON =
                new JSONObject(ctx.getAuthContextJSON());
            String requestor = pluginAuthJSON.getString("requestor");
 
            /* Get custom attributes defined in plugin configuration such as email server,
               to address etc */
            JSONObject plugin = new JSONObject(pluginCfgJSON);
            JSONObject config = plugin.getJSONObject("plugin");
 
            JSONArray customAttrsArr = new JSONArray();
            if (config.has("pluginCustomAttrs"))
                customAttrsArr = config.getJSONArray("pluginCustomAttrs");
 
            String smtpServer = null;
            String smtpPort = null;
            String fromAddr = null;
            String user = null;
            String password = null;
            JSONArray emailList = null;
 
            for (int i = 0; i < customAttrsArr.length(); i++) {
                JSONObject singleJSON = customAttrsArr.getJSONObject(i);
                JSONObject singleAttr =
                    singleJSON.getJSONObject("pluginCustomAttr");
 
                String attrName = singleAttr.getString("attrname");
 
                if (attrName.equalsIgnoreCase("smtp_server"))
                    smtpServer =
                            singleAttr.getJSONArray("attrvalue").getString(0);
                if (attrName.equalsIgnoreCase("smtp_port"))
                    smtpPort =
                            singleAttr.getJSONArray("attrvalue").getString(0);
                if (attrName.equalsIgnoreCase("from_addr"))
                    fromAddr =
                            singleAttr.getJSONArray("attrvalue").getString(0);
                if (attrName.equalsIgnoreCase("to_addr"))
                    emailList = singleAttr.getJSONArray("attrvalue");
                if (attrName.equalsIgnoreCase("user"))
                    user = singleAttr.getJSONArray("attrvalue").getString(0);
                if (attrName.equalsIgnoreCase("password"))
                    password =
                            singleAttr.getJSONArray("attrvalue").getString(0);
            }
 
            for (int i = 0; i < emailList.length(); i++) {
                Properties properties = System.getProperties();
                properties.setProperty("mail.smtps.host", smtpServer);
                properties.setProperty("mail.smtp.port", smtpPort);
                if (user != null && password != null) {
                    properties.setProperty("mail.user", user);
                    properties.setProperty("mail.password", password);
                }
                Session session = Session.getDefaultInstance(properties);
 
                MimeMessage message = new MimeMessage(session);
 
                message.setFrom(new InternetAddress(fromAddr));
                message.addRecipient(Message.RecipientType.TO,
                                     new InternetAddress(emailList.getString(i)));
 
                /* Set the email subject and body */
                String subject =
                    "OPAM Notification : " + resourceType + " " + operationName;
                String emailBody =
                    "Target : " + targetName + "\nAccount : " + accountName +
                    "\nOperation : " + operationName + "\nRequestor : " +
                    requestor;
                message.setSubject(subject);
                message.setText(emailBody);
 
                /* Send the email */
                Transport.send(message);
                result.appendLog("Completed EmailNotificationPlugin successfully");
                ctx.setPluginResult(result);
            }
        } catch (Exception e) {
            result.appendLog("Exception happened: " + e);
 
            result.setErrorCode(PluginResult.CODE_FAILURE);
            result.setErrorMsg(e.getMessage());
            ctx.setPluginResult(result);
        }
    }
}

例18-5 電子メール通知のpostプラグイン・カスタム属性プロパティ・ファイル(EmailNotification.properties)

 <customattribute>
    <name value="smtp_server"/>
    <default value=[""]/>
    <mask value="false"/>
    <required value="true"/>
  </customattribute>
 <customattribute>
    <name value="smtp_port"/>
    <default value=["25"]/>
    <mask value="false"/>
    <required value="true"/>
  </customattribute>
  <customattribute>
    <name value="to_addr"/>
    <default value=[""]/>
    <mask value="false"/>
    <required value="true"/>
  </customattribute>
  <customattribute>
    <name value="from_addr"/>
    <default value=[""]/>
    <mask value="false"/>
    <required value="true"/>
  </customattribute>
  <customattribute>
    <name value="user"/>
    <default value=[""]/>
    <mask value="false"/>
    <required value="false"/>
  </customattribute>
  <customattribute>
    <name value="password"/>
    <default value=[""]/>
    <mask value="true"/>
    <required value="false"/>
  </customattribute>

18.6 プラグインの管理

プラグインの管理の詳細は、次のとおりです。