Oracle Identity Managerのサービス・フレームワークでは、新しいサービスを追加することによってプラットフォームを拡張できます。新しい要件に合うように、既存のサービスを拡張または変更することもできます。Oracle Identity Managerでは、この要件はプラグイン・フレームワークによってサポートされています。
この章では、プラグイン・フレームワークの基本機能と、プラグインを使用して環境をカスタマイズするための共通タスクの実行方法について説明します。内容は次のとおりです。
プラグインは、Oracle Identity Managerによって提供される機能の機能性を拡張するソフトウェアです。プラグイン・フレームワークにより、各機能によって提供される機能性を拡張するプラグインを定義、登録および構成できます。プラグインは、事前定義またはカスタム開発でき、プラグイン・ポイントで使用できます。
プラグイン・ポイントは、拡張性を追加できる、ビジネス・ロジック内の特定のポイントです。そのようなポイントには、プラグイン・インタフェースと呼ばれるインタフェース定義が付随しています。ユーザーは、ビジネス要件に基づいてプラグイン・インタフェースを拡張し、プラグインとして登録できます。
この項では、プラグイン・フレームワークについて次のトピックで説明します。
プラグイン・フレームワークによって、数多くの追加機能がOracle Identity Managerに提供されます。例:
サービスによって、機能性を拡張できるプラグイン・ポイントを定義できます。たとえば、電子メール通知を送信するために、通知エンジンによってデフォルトのプロバイダが使用されます。このプロバイダをプラグイン・ポイントとして設定し、カスタム電子メール・プロバイダを実装できるようにします。
サービスによって、特定のプラグイン・ポイントに対して定義されているすべてのプラグインを検出できます。
プラグインは、複数のソースからロードできます。機能開発者は、プラグインの格納場所やロード方法を気にする必要はありません。
開発者は、プラグインを再登録しなくてもプラグイン・コードを変更できます。注意: これは、プラグインがファイル・システムに格納されている場合にのみ可能です。
プラグイン・フレームワークでは、次の2つのタイプのストアにプラグインを格納できます。
ファイル・システム
Oracle Identity Managerデータベース
プラグインを検索する場合は、フレームワークによって、データベースに登録されているプラグインが最初に調べられてから、ファイル・システムが調べられます。
ファイル・ストアは、Oracle Identity Managerホスト上の1つ以上のディレクトリで構成されており、主に開発環境で使用されます。このタイプのストアは、本番環境には適していません。ファイル記憶域は、開発したプラグインをファイル・ストアに明示的に登録する必要がないため、開発者にとって便利です。ユーザーは、プラグインzipまたは展開されたプラグイン・ディレクトリを指定の場所にドロップインするだけです。
デフォルトでは、プラグインはプラグイン・フレームワークによってOIM_HOME/plugins
ディレクトリで検索されます。プラグイン・ディレクトリを追加指定することもできます。
監視スレッドが有効な場合は、プラグイン・フレームワークによって、ファイル・システム内の登録済プラグイン・ディレクトリでプラグインzipファイルのすべての追加、変更および削除が監視され、プラグインは自動的にリロードされます。名前、バージョン、IDなどのプラグイン・メタデータがプラグインzipから読み取られ、メモリー内で維持されます。このメタデータは、ファイルの変更に基づいて更新されます。最新のプラグインzipファイルが、現行バージョンのプラグインとみなされます。
ファイル・ストアの構成方法の詳細は、第7.2項「プラグインの構成」を参照してください。
プラグインはOracle Identity Managerデータベースに格納できるため、クラスタ内の任意のノードからアクセスできます。プラグイン・フレームワークでは、データベース・ストアとして業務系DBが使用されます。このタイプのストアは、本番環境に適しています。
データベースに格納されるプラグインは、明示的に登録する必要があります。コマンドライン・ツールであるプラグイン登録ユーティリティを使用して、プラグインを登録および登録解除できます。また、registerPlugin
APIをこの用途に使用することもできます。プラグインの登録の詳細は、第7.4項「プラグインの登録」を参照してください。
注意: プラグインを登録した後で、サーバーを再起動する必要があります。ただし、サーバーの再起動は、プラグイン・ポイントを定義する機能に依存する場合もあります。 |
プラグインの開発および実装の基本手順は次のとおりです。
プラグイン・ポイントの値マッピングのタイプを指定できるプラグイン・インスタンスを宣言します。
プラグイン・メタデータを構成するプロパティを指定します。
プラグイン・コードを開発し、プラグインを配布します。
詳細は、第7.3項「プラグインの定義と使用」を参照してください。
MDS内のoim-config.xmlファイルを使用して、次のものを構成します。
関連項目: oim-config.xmlファイルの構成の詳細は、Oracle Fusion Middleware Oracle Identity Manager管理者ガイドのoim-config.xmlファイルの構成に関する説明を参照してください。 |
ファイル・ストアによってプラグインが検索されるディレクトリ。
ファイル・ストアに変更があるかどうかを監視するスレッドをアクティブにするかどうか(このスレッドによって、すべてのプラグイン・ディレクトリ内のzipファイルまたは展開されたファイルが確認されます)。
監視スレッドは、動的開発環境ではプラグインが追加または変更されているため通常はアクティブ化されており、一連のプラグインが含まれている本番システムでは非アクティブにすることができます。これは、reloadingEnabled属性を使用して追跡できます。
監視スレッドがウェイクアップして変更を検索する間隔。
次に、oim-config.xml
ファイルのコード・スニペットを示します。
<pluginConfig storeType="common"> <storeConfig reloadingEnabled="true" reloadingInterval="20"> <!-- Plugins present in the OIM_HOME/plugins directory are added by default. For adding more plugins, specify the plugin directory as below: <registeredDirs>/scratch/oimplugins</registeredDirs> <registeredDirs>/scratch/custom</registeredDirs> --> </storeConfig> </pluginConfig>
この例の内容は次のとおりです。
common
ストア指定によって、フレームワークはデータベースとファイル・ストアの両方を監視するように指定されます。
注意:
|
1つのディレクトリが構成されますが、<registeredDirs>タグを追加することによって追加ディレクトリを構成できます。
デフォルトで、監視スレッドがアクティブであり、プラグインの変更が20秒ごとに検索されます。
監視は、通常は開発環境のみでアクティブです。アクティブと非アクティブを切り替える場合は、アプリケーション・サーバーを再起動して変更を有効にする必要があります。
注意: oim-config.xmlファイルのプラグイン・データのあらゆる変更に、アプリケーション・サーバーの再起動が必要です。 |
この項では、プラグインの定義と設定の重要事項について説明します。
注意: 次のトピックは別々の項で説明しますが、必ずしも順番に実行する手順ではありません。プラグイン・ポイント、そのプラグイン、プラグイン・メタデータの宣言などのタスクを1つの手順で一緒に実行できます。 |
Oracle Identity Managerで提供される機能を拡張するために、アプリケーションに対してプラグインを宣言できます。
プラグインには、プラグイン・ポイント・インタフェースを実装するJavaクラスがあります。特定のプラグイン・ポイントに関連付けられるすべてのプラグインに、一意の名前を割り当ててください。プラグイン名が一意でないと、プラグインの登録時に例外がスローされます。
<?xml version="1.0" encoding="UTF-8"?> <oimplugins> .... <plugins pluginpoint="oracle.iam.sample.passwdmgmt.service.PasswordElement"> <plugin pluginclass= "oracle.iam.sample.passwdmgmt.custom.NumCustomPasswordElement" version="1.0.1" name="num pwd element"/> <plugin pluginclass= "oracle.iam.sample.passwdmgmt.custom.DictionaryPasswordElement" version="1.0.1" name="Dictionary password element" /> </plugins> .... </oimplugins>
注意: 複数のバージョンのプラグインを格納でき、機能によって特定のバージョンのプラグインをプラグイン・フレームワークから要求できます。 |
このXMLには、2つのプラグイン宣言があります。両方のプラグインが同じプラグイン・ポイントから拡張されます。
plugin.xml
で定義する各プラグインとともに、プラグイン・メタデータを構成するプロパティのリストを指定できます。プラグイン・メタデータの使用例は、「リクエスト管理操作の拡張」を参照してください。
この例では、メタデータはPasswordElementNum
という1つのプロパティと値1
で構成されています。
<?xml version="1.0" encoding="UTF-8"?> <oimplugins> .... <plugins pluginpoint="oracle.iam.sample.passwdmgmt.service.PasswordElement"> <plugin pluginclass= "oracle.iam.sample.passwdmgmt.custom.NumCustomPasswordElement" version="1.0.1" name="num pwd element"> <metadata name="PasswordElementNum"><value>1</value></metadata> </plugin> <plugin pluginclass= "oracle.iam.sample.passwdmgmt.custom.DictionaryPasswordElement" version="1.0.1" name="Dictionary password element" > <metadata name="PasswordElementNum"><value>2</value></metadata> </plugin> </plugins> .... </oimplugins>
プラグインを開発するには、次の手順を実行します。
拡張するプラグイン・ポイントを識別します。
プラグイン・ポイント・インタフェースを実装するJavaクラスを識別します。Javaクラスおよびその他の依存クラスをJARファイルにパッケージ化します。JARファイルをlib/ディレクトリに置きます。
plugin.xmlファイルを作成します。詳細は、「プラグインの宣言」を参照してください。
プラグインに必要なリソース・ファイル(プロパティ・ファイル、リソース・バンドル、画像ファイルなど)を識別します。
パッケージ全体をZipに圧縮します。
Oracle Identity Managerプラグインは、指定されたディレクトリ構造でZIPファイルとして配布されます。そのディレクトリ構造は次のとおりです。
plugin.xmlファイル: XMLファイルには、すべてのプラグインに関連付けられたメタデータ(拡張されるプラグイン・ポイント、プラグインを実装するクラス、名前、バージョン番号など)が含まれています。XML内のすべてのフィールドは、名前を除いて必須です。名前を指定しない場合は、プラグイン・クラス名が名前として使用されます。
lib/ディレクトリ: lib/ディレクトリは、プラグイン・ロジックを実装するクラスを含むJARファイルおよび依存ライブラリJARファイルで構成されています。ほとんどの場合、このディレクトリは、plugin.xmlに指定されたすべてのプラグインの実装を含む1つのJARファイルで構成されます。
resources/ディレクトリ: プラグインに必要なリソース・ファイル(プロパティ・ファイル、リソース・バンドル、画像ファイルなど)が含まれています。プラグインzipのresourcesディレクトリに指定されたこれらのリソースには、次のようにアクセスできます。
this.getClass().getClassLoader().getResourceAsStream(<resource_name>);
同じプラグイン・ポイントを実装する複数のプラグインを、同じZIPファイルの一部にすることができます。
プラグインには、プラグイン・ポイント・インタフェースを実装するJavaクラスがあります。プラグイン・ライブラリ(JAR)にその他の依存クラスも含めることができますが、プラグインを実装するクラスは、機能に対して公開される1つのみです。このクラスをplugin.xmlで指定する必要があります。
ZIPファイルをファイル・ストア(lib/ディレクトリ)またはデータベース・ストアに置きます。詳細は、「プラグイン・ストアについて」を参照してください。
ZIPをデータベース・ストアに置く場合は、「プラグインの登録」で説明するように、プラグイン登録ユーティリティを使用してプラグインを登録します。
APIおよびプラグイン登録ユーティリティを使用して、プラグインを登録できます。
登録関連のタスクには、次のAPIを使用できます。
PlatformService.registerPlugin
PlatformService.unRegisterPlugin
次に例を示します。
ClientPlatform platform = OIMClient.getInstance(); platform.login("username", "password"); PlatformService service = platform.getService(PlatformService.class); File zipFile = new File(fileName); FileInputStream fis = new FileInputStream(zipFile); int size = (int) zipFile.length(); byte[] b = new byte[size]; int bytesRead = fis.read(b, 0, size); while (bytesRead < size) { bytesRead += fis.read(b, bytesRead, size - bytesRead); } fis.close(); service.registerPlugin(b); service.unRegisterPlugin(pluginID, version);
プラグインの登録および登録解除にプラグイン登録ユーティリティを使用できます。このユーティリティでは、次のファイルが使用されます。
pluginregistration.xml
ant.properties
これらのファイルは、OIM_HOME/plugin_utility/ディレクトリにあります。
注意: プラグイン登録ユーティリティには、Apache Antバージョン1.7以上が必要です。 |
このユーティリティを使用する前に、次のことを実行します。
ant.propertiesのWLS_HOMEおよびOIM_HOMEの値を設定します。
例:
WLS_HOME =.../middleware/wlserver_10.3 OIM_HOME =..../middleware/Oracle_IDM1/server
Oracle WebLogic serverでwlfullclient.jarをビルドします。
ディレクトリをWLS_HOME/server/libに変更します。
次のコマンドを実行します。
java -jar ../../../modules/com.bea.core.jarbuilder_1.3.0.0.jar
注意: JARファイルの正確なバージョンは、WLSによって異なる場合があります。WLS_HOME/../modules/ディレクトリにある |
プラグインの登録
プラグインを登録する手順は、次のとおりです。
antターゲットの登録を実行します。
ant -f pluginregistration.xml register
これにより、Oracle Identity Managerのユーザー名およびパスワードとサーバー情報およびプラグインzipファイルの場所が要求されます。zipファイルの場所の完全なパスを入力します。
プラグインの登録解除
プラグインを登録解除するには、次の手順を実行します。
antターゲットの登録解除を実行します。
ant -f pluginregistration.xml unregister
これにより、Oracle Identity Managerのユーザー名およびパスワードとサーバー情報およびプラグイン・クラスのクラス名が要求されます。完全なパッケージを含むクラス名を入力します。
マップされた値を使用して、環境に関するコンテキスト情報を設定および提供できます。単純なマップされた値によって、値の1対1マッピングを格納できるハッシュ表が構築されます。
単純なマップされた値を決定するために、プラグイン・フレームワークによって次のロジックが使用されます。
特定のメソッドに対して指定されたマッピングが属性にある場合、そのマッピングが使用されます。
すべてのメソッドに対して同じマッピングが属性によって使用される場合、そのマッピングが常に使用されます。
それ以外で、マッピングが指定されていない場合は、NoSuchMappingException
がスローされます。
マッピングの属性が宣言されている場合は、それをキーとして使用して、提供されているHashMap
で値が参照されます。
マッピングの属性は宣言されていないが、マッピングの値が宣言されている場合は、その値が返されます。
ハッシュ・マップの構築および使用方法の例を次に示します。
public boolean evaluate(String password) { Map<String, Object> ro = new HashMap<String, Object>(); ro.put("smvalue1", "value"); ro.put("smattr2", "value2"); // Using the mappings declared in Example 22-1, attr1 would // have the value of "smvalue1". String attr1 = PluginFramework.getMappedValue(this, ro, "attr1", "evaluate"); // Using the mappings declared in Example 22-1, attr1 would // have the value of "value2" String attr2 = PluginFramework.getMappedValue(this, ro, "attr2", "evaluate");
ここで、Example 22-1は、例7-1で示されているサンプルplugin.xmlのことです。
例7-1 サンプルPlugin.xml
<?xml version="1.0" encoding="UTF-8"?> <oimplugininstances> <plugininstances name="CustomPasswordElementInstance" plugin="num pwd element" pluginpoint="oracle.iam.sample.passwdmgmt.service.PasswordElement" version="1.0.1"> <metadata name="meta1"> <value>1</value> </metadata> <mapping method="evaluate"> <simple-mapping name="attr1" entity-type="User" value="smvalue1" /> <runtime-mapping name="phone" entity-type="User" attribute="phonenumber" value="N/A" /> </mapping> <mapping> <simple-mapping name="attr1" entity-type="User" value="value1" /> <simple-mapping name="attr2" entity-type="User" attribute="smattr2" /> <runtime-mapping name="fname" entity-type="User" attribute="firstname" /> <runtime-mapping name="lname" entity-type="User" attribute="lastname" /> </mapping> <description>Test class for plugin mapped value</description> </plugininstances> </oimplugininstances>
単純なマップされた値を決定するために、プラグイン・フレームワークによって次のロジックが使用されます。
特定のメソッドに対して指定されたマッピングが特定の属性名にある場合、そのマッピングが使用されます。それ以外で、すべてのメソッドに対して指定されたマッピングが特定の属性名にある場合、そのマッピングが使用されます。それ以外の場合は、NoSuchMappingException
が生成されます。
マッピングの属性が宣言されている場合は、属性をキーとして使用して、提供されているHashMapで値が参照されます。
マッピングの属性は宣言されていないが、マッピングの値が宣言されている場合は、その値が返されます。例:
Map<String, Object> ro = new HashMap<String, Object>(); ro.put("smvalue1", "value"); ro.put("smattr2", "value2"); String attr1 = PluginFramework.getMappedValue(this, ro, "attr1", "evaluate"); String attr2 = PluginFramework.getMappedValue(this, ro, "attr2", "evaluate");
表7-1に、Oracle Identity Managerでプラグイン・ポイントとして機能するJavaインタフェースを示します。
表7-1 プラグイン・ポイント
プラグイン・ポイント | 説明 |
---|---|
oracle.iam.ldapsync.LDAPContainerMapper |
これは、LDAPでユーザーまたはロールを作成するために使用する必要があるユーザー・コンテナまたはロール・コンテナを決定するために、LDAP同期によって使用されます。 |
oracle.iam.platform.kernel.spi.EventHandler |
これは、カーネル・イベント・ハンドラです。カーネル・イベント・ハンドラの詳細は、第8章「ユーザー管理操作の拡張のためのイベント・ハンドラの開発」を参照してください。 |
oracle.iam.platform.auth.api.LoginMapper |
これは、JAASユーザー・プリンシパル名を対応するOracle Identity Managerユーザー名にマップするLoginMapperの実装です。このプラグイン・ポイントは、SSOシナリオのJAASユーザー・プリンシパル名からOracle Identity Managerユーザー名へのデフォルトのマッピングを上書きするために使用されます。デフォルトの実装では、JAASユーザー・プリンシパル名と同じ値が返されます。このプラグイン・ポイントは、通常、JAASユーザー・プリンシパル名とOracle Identity Managerユーザー名が異なる場合があるSSOシナリオで使用されます。たとえば、SSOシステムで電子メールがJAASユーザー名として設定される場合がありますが、そのユーザー名を持つユーザーはOracle Identity Managerには存在しません。Oracle Identity Managerでそのユーザーが認識されるには、JAASユーザー・プリンシパル名をOracle Identity Managerユーザー名にマップする必要があります。これを実行するには、次に示すように、LoginMapperのプラグインを実装します。 public class CustomLoginMapper implements LoginMapper{ public String getOIMUserID(String jaasPrincipal) throws MappingException { return getUserName(jassPrincipal); } private String getUserName(String emailID){ String userName = null; //Use usermgmt APIs to get the username corresponding to this email id return userName; } } |
oracle.iam.identity.usermgmt.api.PasswordVerifier |
これは、ユーザーのパスワード変更時に古いパスワードを検証するために使用されます。この検証に使用されるクラスは、OIM.OldPasswordValidatorシステム・プロパティで構成します。デフォルトでは、古いパスワードの検証にはコンテナ・ベースの認証を使用します。 |
oracle.iam.request.plugins.StatusChangeEvent |
これにより、リクエスト・ステータス変更中にカスタム・コードを実行できます。 |
oracle.iam.request.plugins.RequestDataValidator |
これは、送信後のリクエスト・データのカスタム検証に使用されます。 |
oracle.iam.request.plugins.PrePopulationAdapter |
これは、リクエスト作成中にカスタム・コードを実行することで属性値を事前移入するために使用されます。 |
oracle.iam.scheduler.vo.TaskSupport |
これは、コンテキストでジョブを実行するために使用されます。タスクの実行メソッドがプラグインによって取得され、ロードされます。 |
oracle.iam.identity.usermgmt.api.UserNamePolicy |
これは、ユーザー名の生成および検証に使用されるユーザー名ポリシーの実装です。 |
oracle.iam.identity.usermgmt.api.ReservationInLDAP |
これは、LDAPでのユーザー属性の予約の実装です。 |