顧客と社内の両方からの要望に応え、オラクル社ではOracle Internet Directoryのサーバー・プラグイン・フレームワークにJava APIを追加しました。サーバー・チェーンなど、Oracle Internet Directoryの新機能のいくつかは、JavaプラグインAPIを使用して開発されました。
この章の項目は次のとおりです。
Java言語自体の利点に加え、Javaサーバー・プラグインには、PL/SQLプラグインに優る次のような利点があります。
サーバーとプラグイン間の双方向通信
プラグインで検索結果を戻す機能
moddn操作のサポート
より高いパフォーマンス
データベースの知識が不要
セキュリティの強化
デバッグ機能の強化
Javaプラグインは次のように設定します。
事前定義済のクラス定義およびメソッドを使用して、スタンドアロンのJavaプログラムを作成します。プラグインは、jarファイルまたはパッケージとして実装できます。
プラグイン・ファイルまたはパッケージをコンパイルします。コンパイルする前に、CLASSPATHが$ORACLE_HOME/ldap/jlib/ospf.jarに設定されていることを確認します。コンパイルがエラーなしで完了していることを確認します。
クラス・ファイル、jarまたはパッケージを、事前に定義したクラスの場所$ORACLE_HOME/ldap/server/pluginに配置します。
プラグイン構成エントリを追加してJavaプラグインを登録します。
エントリは、コマンドラインまたはOracle Directory Services Managerを使用して追加できます。詳細は、第45.3項「コマンドラインでのプラグインの登録」および第45.4項「Oracle Directory Services ManagerおよびOracle Enterprise Manager Fusion Middleware Controlを使用したプラグインの管理」を参照してください。
jarファイルには任意の名前を付けることができます。マニフェスト・ファイルには、後ろにJavaプラグインの名前が続く、属性Main-Classが含まれている必要があります。次に例を示します。
Main-Class: myjavaplugin
プラグイン構成エントリのorclPluginName属性の値は、次のいずれかと対応している必要があります。
クラス・ファイル内のクラス名
パッケージ内のクラスの完全修飾名
jarファイル名
orclPluginName属性の値により、サーバーでクラスまたはjarファイルを検索する場所が決定されます。表E-1に、いくつかの例を示します。
表E-1 プラグイン名および対応するパス
| orclPluginName | パス |
|---|---|
|
|
|
|
|
|
|
|
|
前述の手順の実行後は、起動基準が満たされるたびに、サーバーによりプラグインが起動されます。
jarファイルに含まれるクラスが環境内に存在しないようにしてください。存在すると、予期しないエラーが発生する可能性があります。この問題を修正するには、環境からクラスを削除し、Oracle Internet Directoryサーバーを再起動します。JARファイルまたはクラス・ファイルが他のJARファイルやクラス・ファイルに依存している場合は、依存しているJARファイルまたはクラス・ファイルのパスをCLASSPATHに追加して、Oracle Internet Directoryサーバーを再起動します。
プラグインが実行されるたびにサーバーでJavaプラグイン・クラスをリロードするかどうかは、制御できます。属性orclPluginClassReloadEnabledの値が1の場合、サーバーはプラグイン・クラスを毎回リロードします。値が0の場合、サーバーは、プラグインの最初の実行時にのみクラスをロードします。
Oracle Internet Directoryサーバー・プラグイン・フレームワークのjarファイルのパスは、$ORACLE_HOME/ldap/jlib/ospf.jarです。
この項では、APIの高度な概要、およびメイン・クラスやインタフェースの役割を説明します。すべてのJavaサーバー・プラグイン・クラスおよびインタフェースの詳細は、Javadocの『Oracle Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。
この項の項目は次のとおりです。
|
注意: JavaプラグインではSystem.exit()を使用しないでください。使用すると、Oracleディレクトリ・サーバーが予期しない動作をする可能性があります。 |
すべてのJavaプラグインでは、プラグインとOracle Internet Directoryサーバーとの通信にServerPluginインタフェースが使用されます。サーバーによりJavaプラグインが起動される際に、PluginDetailオブジェクトが構成され、そのオブジェクトに含めた情報がプラグインに渡されます。プラグインにより、PluginResultオブジェクトが構成されます。タスクが完了すると、プラグインによりPluginResultオブジェクトがサーバーに戻されます。プラグインにより、PluginDetailから受信した情報に変更または追加が加えられ、PluginResultオブジェクトに含めたその情報がサーバーに戻される場合もあります。図E-1は、Oracle Internet DirectoryサーバーとJavaプラグインの間の通信を示しています。
Javaプラグインでは、ログ・ファイルにメッセージを記録するために、ServerLogクラスも使用できます。
次に、Javaプラグインの一般的な構造を示します。
public class Java_Plug-in_Class_Name {extends ServerPluginAdapter} { public PluginResult Name_of_ServerPlugin_Method(PluginDetail plgObj) throws Exception { // Plug-in Code } }
または
public class Java_Plug-in_Class_Name {implements ServerPlugin} { public PluginResult Name_of_ServerPlugin_Method(PluginDetail plgObj) throws Exception { // Plug-in Code } }
PluginDetailには、次の項で説明する情報が含まれます。
このオブジェクトには、プラグインが実行されるOracle Internet Directoryサーバーに関するメタデータ情報が含まれます。次の情報が含まれます。
Hostname
ポート
LdapContext
HostnameおよびPortは、サーバーが稼働しているホストとポートを示します。
LdapContextオブジェクトによって、プラグインはサーバーに接続し返し、接続がプラグインから取得されていることを通知できます。これは、ldapbind自体を実行するldapbindプラグインなどに必要です。LdapContextオブジェクトを使用してサーバーに接続すると、サーバーにより同じプラグインが起動され、それが原因で無限ループが発生するのを防ぐことができます。
次のコード・フラグメントは、プラグインがPluginDetailからServerオブジェクトを取得し、サーバーに接続する様子を示しています。
// An LDAP Bind Plug-in
public class MyBindPlugin extends ServerPluginAdapter
{
…..
// Retrieve the Server Object from the PluginDetail
Server srvObj = plgObj.getServer();
……
// This bind will not result in the LDAP Bind Plug-in being called
// in an infinite loop
InitialLdapContext myConn =
(InitialLdapContext)srvObj.getLdapContextFromServerPlugin();
myConn.bind(…);
….
}
この例で使用されているメソッドの詳細は、Javadocの『Oracle Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。
LdapBaseEntryには、次の情報が含まれます。
DN
属性
ldapaddを除き、すべての操作のDN情報をサーバーから送信する必要があります。表E-2は、各操作のDNの内容を示しています。
表E-2 各LDAP操作のDN情報の内容
| 操作 | DNの内容 |
|---|---|
|
ldapadd |
DNは送信されません。 |
|
ldapbind |
ディレクトリ・サーバーがバインドを試行するエントリ。 |
|
ldapcompare |
比較が実行されるベース・エントリ。 |
|
ldapdelete |
タイミングが前および操作時の場合に削除されるエントリ。 タイミングが後の場合、DNは送信されません。 |
|
ldapmoddn |
移動対象のベース・エントリ。 |
|
ldapmodify |
タイミングが前および操作時の場合に変更が行われるエントリ。 タイミングが後の場合に変更されるエントリ。 |
|
ldapsearch |
検索のベース・エントリ。 |
AttributesはJNDI属性です。
LdapBaseEntryには、DNおよびAttributesにアクセスするためのメソッドがあります。LdapBaseEntryがグループ・エントリで、エントリ・キャッシュ機能が無効な場合、パフォーマンス上の理由から、属性uniquememberおよびmemberにはアクセスできません。
|
関連項目: パフォーマンス・チューニングの詳細は、『Oracle Fusion Middlewareパフォーマンスおよびチューニング・ガイド』の「Oracle Internet Directory」の章を参照してください。 |
すべてのプラグインは、add、bind、compare、delete、moddn、modifyまたはsearchの7つの基本的なLDAP操作のいずれかに関連付けられています。LdapOperationオブジェクトには、次の情報が含まれ、7つのすべての操作に渡されます。
Bind DN
Server Controls
Operation Result Code
Bind DNは、LDAP操作をリクエストするアイデンティティの識別名です。Server Controlsは、制御情報を含むベクターです。操作中に任意のサーバー・コントロールがサーバーに渡された場合、制御情報はServer ControlsのJavaプラグインに渡されます。表E-2に示すように、Operation Result Codeの内容は操作のタイミングによって異なります。操作時置換の場合、プラグインによるOperation Result Codeの情報の変更が可能で、その情報はPluginResultに含められてサーバーに渡されます。
表E-3 Operation Result Codeの動作
| プラグインのタイミング | Operation Result Codeの内容および動作 |
|---|---|
|
前 操作時 |
使用しない |
|
操作時置換 |
プラグインによって行われたLDAP操作のエラー状態。プラグインからサーバーへの出力。 |
|
後 |
サーバーによって実行されたLDAP操作のエラー・ステータス。サーバーからプラグインへの入力です。 |
LdapOperationには、コンテンツを取得および変更するためのメソッドもあります。
7つのLDAP操作を表す異なる7つのクラスにより、LdapOperationクラスが拡張されます。各サブクラスには、LdapOperation情報の他に、クラス固有の情報も含まれます。表E-4は、クラスおよびクラス固有の情報を示しています。表E-4の各クラス名は、そのクラスの詳細が説明されている項にリンクされています。
表E-4 LdapOperationのサブクラスおよびクラス固有の情報
| クラス | クラス固有の情報 |
|---|---|
|
|
|
|
|
Bind Password |
|
|
属性名 Attribute Value |
|
|
Delete DN |
|
|
New Parent DN New Relative DN Delete Old RDN New DN |
|
|
|
|
|
Filter Required Attributes Scope
|
各クラスには、情報を作成、変更および取得するためのメソッドもあります。クラス固有の情報は、プラグインへの入力またはプラグインからサーバーへの出力(あるいはその両方)を表します。
操作固有のクラスの詳細は、この項のこれ以降の部分で説明します。
ldapaddプラグインの起動時に、サーバーにより、追加するエントリの情報を渡すためのLdapEntryオブジェクトを含むAddLdapOperationオブジェクトが構成されます。LdapEntryオブジェクトには、次の情報が含まれます。
DN
属性
DNは、追加するエントリの識別名を表します。Attributesは、エントリのJNDI属性です。表E-5に示すように、操作後を除くすべての操作で、プラグインによるLdapEntryの情報の変更が可能で、その情報はサーバーに戻されます。
サーバーにより、ldapbindプラグインに次の情報が渡されます。
Bind Password
Proxy Requester DN
Bind Passwordは、バインド用のパスワードです。Proxy Requester DNは、プロキシ・スイッチをリクエストするアイデンティティの識別名です。
サーバーにより、ldapcompareプラグインに次の情報が渡されます。
属性名
Attribute Value
Attribute Nameは、ldapcompare操作中に比較される名前です。表E-6に示すように、操作後を除くすべての操作で、プラグインによるAttribute Nameの情報の変更が可能で、その情報はサーバーに戻されます。
表E-6 各プラグインのタイミングに対するAttributeNameの動作
| プラグインのタイミング | Attribute Name情報の動作 |
|---|---|
|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
|
後 |
入力のみ。 |
Attribute Valueは、ldapcompare操作中に比較される値です。表E-7に示すように、操作後を除くすべての操作で、プラグインによるAttribute Valueの情報の変更が可能で、その情報はサーバーに戻されます。
サーバーはDelete DNオブジェクトをldapdeleteプラグインに渡します。これは削除される識別名です。表E-8に示すように、操作後を除くすべての操作で、プラグインによるDelete DNの情報の変更が可能で、その情報はサーバーに戻されます。
サーバーにより、ldapmoddnプラグインに次の情報が渡されます。
New Parent DN
New Relative DN
Delete Old RDN
New DN
New Parent DNには、PluginDetailのLdapBaseEntryに指定されたRDNの新規の親が含まれます。表E-9に示すように、操作後を除くすべての操作で、プラグインによるNew Parent DNの情報の変更が可能で、その情報はサーバーに戻されます。
表E-9 各プラグインのタイミングに対するNew Parent DN情報の動作
| プラグインのタイミング | New Parent DN情報の動作 |
|---|---|
|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
|
後 |
入力のみ。 |
New Relative DNは、PluginDetailのLdapBaseEntryに指定されたRDNを置き換える新規のRDNです。表E-10に示すように、操作後を除くすべての操作で、プラグインによるNew Relative DNの情報の変更が可能で、その情報はサーバーに戻されます。
表E-10 各プラグインのタイミングに対するNew Relative DN情報の動作
| プラグインのタイミング | New Relative DN情報の動作 |
|---|---|
|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
|
後 |
入力のみ。 |
Delete Old RDN値には、PluginDetailのLdapBaseEntryに指定されている古いRDNを、新規の相対識別名に置き換えた後も格納するかどうかを指定します。表E-11に示すように、操作後を除くすべての操作で、プラグインによるDelete Old RDNの値の変更が可能で、その情報はサーバーに戻されます。
表E-11 各プラグインのタイミングに対するDelete Old RDN情報の動作
| プラグインのタイミング | Delete Old RDN情報の動作 |
|---|---|
|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
|
後 |
入力のみ。 |
New DNは、ldapmoddn操作のターゲット識別名を指定します。この情報は、サーバーからプラグインへの入力のみです。プラグインがこの情報を変更してサーバーに戻すことはできません。
サーバーにより、ldapmodifyプラグインにLdapModificationオブジェクトが渡されます。LdapModificationオブジェクトには、JNDI変更アイテムであるModification Itemが含まれます。表E-12に示すように、操作後を除くすべての操作で、プラグインによるLdapModificationの情報の変更が可能で、その情報はサーバーに戻されます。
SearchLdapOperationオブジェクトには、次の情報が含まれます。
Filter
Required Attributes
Scope
SearchResultSet
Filter、Required AttributesおよびScopeはサーバーによって渡されます。
Filterには、ldapsearch操作に指定されたLDAP検索フィルタが含まれます。これは、プラグインへの入力のみです。プラグインがこの情報を変更してサーバーに戻すことはできません。
Required Attributesには、ldapsearch操作に指定された必須属性が含まれます。表E-13に示すように、操作後を除くすべての操作で、プラグインによるRequired Attributesの情報の変更が可能で、その情報はサーバーに戻されます。
表E-13 各プラグインのタイミングに対するRequired Attributesの動作
| プラグインのタイミング | Required Attributes情報の動作 |
|---|---|
|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
|
後 |
入力のみ。 |
Scopeには、ldapsearch操作により実行される検索の範囲が含まれます。表E-14に示すように、操作後を除くすべての操作で、プラグインによるScopeの情報の変更が可能で、その情報はサーバーに戻されます。
表E-14 各プラグインのタイミングに対するScopeの動作
| プラグインのタイミング | Scope情報の動作 |
|---|---|
|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
|
後 |
入力のみ。 |
SearchResultSetは、Javaプラグインからサーバーに戻される検索結果を定義します。ldapsearch操作を実行するプラグインは、このオブジェクトを構成できます。表E-15に示すように、SearchResultSetをサーバーに戻すことができるのは操作時プラグインと操作時置換プラグインのみです。
プラグインを登録すると、プラグイン構成エントリにカスタム情報を格納できます。サーバーによりプラグインが起動される際に、PluginFlexfieldに含めたこの情報がプラグインに渡されます。
構成エントリにカスタム情報を格納するためのスキーマ属性は3つあります。orclPluginFlexfield属性にはテキスト情報を格納できます。格納するカスタム情報をさらに詳細に記録するには、サブタイプを使用できます。たとえば、サブタイプorclPluginFlexfield;ad-hostを使用して、プラグインが接続する必要のあるActive Directoryサーバーのホスト名を格納できます。
orclPluginBinaryFlexfield属性には、バイナリ値を格納できます。サーバーではバイナリ属性の属性サブタイプがサポートされていないため、プラグインごとにorclPluginBinaryFlexfieldに格納できるのは1つの値のみです。
クリアテキストには表示しないカスタム・テキスト情報を格納するには、orclPluginSecuredFlexfieldを使用できます。値は暗号化形式で格納および表示されます。ユーザーがこの属性をクリアテキストで取得できないようにするため、Oracle Internet Directoryでは必ずプライバシ・モードを有効にします。第28.7項「受信した機密の属性のプライバシの構成」を参照してください。サブタイプを使用して、格納するカスタム情報の種類をわかりやすくすることができます。orclPluginFlexfieldと同じサブタイプ形式を使用してください。
サーバーによりプラグインが起動されるときに、orclPluginFlexfield、orclPluginBinaryFlexfieldおよびorclPluginSecuredFlexfieldからPluginFlexfieldオブジェクトに含まれた情報がプラグインに渡されます。プラグインにより情報が解析されて使用されます。これは、PluginFlexfieldをサーバーに返すことはできません。
次に示す構成エントリの例では、orclPluginFlexfieldのサブタイプにより、パスワードの長さは8文字以上で、数値が含まれている必要があり、同じ文字は繰返し使用できないことが指定されています。
dn: cn=pre_add replace,cn=plugin,cn=subconfigsubentry orclPluginFlexfield;minPwdLength: 8 orclPluginFlexfield;isDigitPwd: 1 orclPluginFlexfield;isRepeatCharsPwd: 0 objectclass: orclPluginConfig objectclass: top orclpluginname: MyJavaPwdCheckPlugin orclplugintype: configuration orclplugintiming: pre orclpluginldapoperation: ldapadd orclpluginenable: 1 orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com orclpluginattributelist: userpassword orclPluginKind: Java
実行結果をサーバーに戻すため、JavaプラグインによりPluginResultオブジェクトが構成され、そのオブジェクトがサーバーに渡されます。PluginResultには、LdapOperationまたはその操作固有のサブクラスの1つの、いずれかのオブジェクトが含まれます。これらのオブジェクトは、第E.3.3.3項「LdapOperation」で説明しました。その項で説明されているように、操作およびタイミングによっては、PluginDetailから受信したLdapOperationサブクラス・オブジェクトの情報をプラグインが変更することが可能で、そのオブジェクトはPluginResultに含まれてサーバーに戻されます。
すべてのJavaプラグインでは、ServerPluginインタフェースが使用されます。このインタフェースには、サーバーと通信するための事前定義済のメソッドがあります。各LDAP操作およびタイミングに対して1つのメソッドがあります。各メソッドでは、PluginDetailオブジェクトが入力として使用され、PluginResultオブジェクトがOracle Internet Directoryサーバーに返されます。
ServerPluginAdapterクラスは、ServerPluginインタフェースを実装します。ServerPluginAdapterクラスには、デフォルト(NULL)で、ServerPluginメソッドが実装されています。このクラスを使用すると、すべてのメソッドを実装しなくてもJavaプラグインをコーディングできます。
この項のこれ以降では、各LDAP操作のServerPluginメソッドを示します。次が含まれます。
public PluginResult pre_bind(PluginDetail pc) throws Exception; public PluginResult when_bind_replace(PluginDetail pc) throws Exception; public PluginResult post_bind(PluginDetail pc) throws Exception;
public PluginResult pre_compare(PluginDetail pc) throws Exception; public PluginResult when_compare_replace(PluginDetail pc) throws Exception; public PluginResult post_compare(PluginDetail pc) throws Exception;
public PluginResult pre_add(PluginDetail pc) throws Exception; public PluginResult when_add(PluginDetail pc) throws Exception; public PluginResult when_add_replace(PluginDetail pc) throws Exception; public PluginResult post_add(PluginDetail pc) throws Exception;
public PluginResult pre_modify(PluginDetail pc) throws Exception; public PluginResult when_modify(PluginDetail pc) throws Exception; public PluginResult when_modify_replace(PluginDetail pc) throws Exception; public PluginResult post_modify(PluginDetail pc) throws Exception;
public PluginResult pre_moddn(PluginDetail pc) throws Exception; public PluginResult when_moddn(PluginDetail pc) throws Exception; public PluginResult when_moddn_replace(PluginDetail pc) throws Exception; public PluginResult post_moddn(PluginDetail pc) throws Exception;
public PluginResult pre_search(PluginDetail pc) throws Exception; public PluginResult when_search(PluginDetail pc) throws Exception; public PluginResult when_search_replace(PluginDetail pc) throws Exception; public PluginResult post_search(PluginDetail pc) throws Exception;
public PluginResult pre_delete(PluginDetail pc) throws Exception; public PluginResult when_delete(PluginDetail pc) throws Exception; public PluginResult when_delete_replace(PluginDetail pc) throws Exception; public PluginResult post_delete(PluginDetail pc) throws Exception;Java plug-in API
すべての未処理例外は、プラグインの実行中にOracle Internet Directoryサーバーによって捕捉されます。各例外の例外スタック・トレースおよびメッセージは、サーバー・ログ・ファイルに記録されます。これらの例外は3つのカテゴリに分類されます。
ランタイム・エラーおよび例外は、不適切なプラグイン・コードまたはロジックが原因で発生します。Javaプラグインの実行中に生成されたすべてのランタイム・エラーおよび例外(NullPointerExceptionなど)は、サーバーにより捕捉されます。これらのエラーおよび例外は、サーバー・ログ・ファイルに記録されます。
プラグインによりスローされる予想される例外は、Oracle Internet Directoryサーバーのログ・ファイルに記録されます。また、例外はプラグインによって捕捉され、サーバー・ログ・ファイルに記録するためにサーバーにスローされます。
プラグインでは、PluginExceptionクラスを使用してエラーを生成できます。PluginExceptionオブジェクトまたはそのサブクラスを使用してサーバーに渡されたエラー・メッセージは、LDAPクライアントに渡されます。このメッセージも、例外スタック・トレースおよびメッセージとともに、サーバーによりサーバー・ログ・ファイルに記録されます。
この項では、3つの例を説明します。次のタイプです。
次に、プラグインの実行中に生成される典型的な例外のログ・エントリを示します。
….
06:17:03 *
ERROR * gslpg_exceptionHndlr * Exception Message : Error
ERROR * gslpg_exceptionHndlr * Exception Stack Trace :
MyCompareJavaPlugin.post_compare(Prog2.java:75)
END
BEGIN
2004/10/19:01:52:13 *
ServerWorker (REG):4 * ConnID:0 * OpID:1 * OpName:compare
ERROR * gslpg_exceptionHndlr * Exception Stack Trace :
java.lang.NullPointerException
java.util.Hashtable.put(Hashtable.java:393)
oracle.ldap.ospf.PluginDetail.put(PluginDetail.java:41)
END
このエラーは、プラグインMyJavaPluginが$ORACLE_HOME/ldap/server/pluginディレクトリに存在しなかったために発生しました。ログ・ファイル・エントリは次のようになります。
BEGIN
2004/10/19:01:52:13 *
ServerWorker (REG):4 * ConnID:0 * OpID:1 * OpName:compare
ERROR * gslpg_exceptionHndlr * Exception Stack Trace :
java.lang.NoClassDefFoundError: MyJavaPlugin
END
PluginExceptionオブジェクトがサーバーにスローされると、Oracle Internet Directoryサーバーにより、その他のエラー・メッセージとともに、標準のプラグイン・エラー・メッセージがLDAPクライアントに戻されます。次に、LDAPクライアントにより表示されるエラーを示します。
ldap_compare: UnKnown Error Encountered ldap_compare: additional info: Error Message returned by the Java Plug-in
プラグインでは、独自のログ・ファイルを保持し、そのファイルにリアルタイムで記録することが可能です。また、プラグインでは、ServerLogクラスを使用して、実行中にOracle Internet Directoryサーバーのログ・ファイルにデバッグ・メッセージを記録できます。ServerLogクラスにメッセージを記録するためのメソッドは、次のようになります。
public static void log(String message);
ServerLog.log()メソッドにより記録されたメッセージは、先頭に次の文字列が付きます。
* Server Java Plug-in *
次に例を示します。
2006/05/11:01:11:28 * ServerWorker (REG):7 ConnID:241 * mesgID:2 * OpID:1 * OpName:bind 01:11:28 * Server Java Plug-in * MESSAGE FROM PLUGIN 01:11:28 * Server Java Plug-in * Bind DN : cn=ad_user,cn=oiddvusers,cn=oraclecontext,dc=us,dc=oracle,dc=com
プラグインのデバッグ・メッセージをサーバー・ログに記録するには、次に示すデバッグ・レベルのいずれかを使用してOracle Internet Directoryサーバーを起動する必要があります。
表E-16 Javaプラグインのロギングのデバッグ・レベル
| Oracle Internet Directoryサーバーのデバッグ・レベル | デバッグ・レベルの内容 |
|---|---|
|
134217728 |
Javaプラグイン・フレームワーク関連のすべてのJavaプラグイン・デバッグ・メッセージと内部サーバー・メッセージ |
|
268435456 |
|
|
402653184 |
上の両方 |
ServerLog.log()メソッドはスレッド・セーフです。このメソッドを実行すると、パフォーマンスが低下する場合があります。
この項では、2つの例を説明します。次のタイプです。
|
注意: JavaプラグインではSystem.exit()を使用しないでください。使用すると、Oracleディレクトリ・サーバーが予期しない動作をする可能性があります。 |
この例では、ldapmodify操作の前にuserPasswordを検証するJavaプラグインを説明します。操作前Javaプラグインは、Oracle Internet Directoryサーバーに登録されています。プラグイン構成には、そのプラグインで検証される最低限のパスワードの長さが含まれます。この情報は、orclPluginFlexfield属性を使用して、プラグイン構成エントリに登録されます。サブタイプminPwdLengthには、最低限の長さが指定されます。この情報は、PluginFlexfieldを使用してプラグインに渡されます。orclPluginNameにより、Oracle Internet Directoryサーバーにより起動されるJavaプラグインの名前が指定されます。
プラグインへの入力はPluginDetailで、プラグインからの出力はPluginResultです。
dn: cn=checkuserpassword,cn=plugin,cn=subconfigsubentry orclPluginFlexfield;minPwdLength: 8 objectclass: orclPluginConfig objectclass: top orclpluginname: CheckPassword orclplugintype: configuration orclplugintiming: pre orclpluginldapoperation: ldapmodify orclpluginenable: 1 orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com orclpluginattributelist: userPassword orclPluginKind: Java
import java.io.*;
import java.lang.*;
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;
import oracle.ldap.ospf.*;
/**
* This PRE modify plug-in will check whether the "userPassword"
* is greater than 8 characters in length
*/
public class CheckPassword extends ServerPluginAdapter {
// This PRE modify plug-in takes in a PluginDetail Object
// and returns a PluginResult Object
public PluginResult pre_modify(PluginDetail plgObj)
throws Exception
{
try {
// Retrieve the LdapOperation Object from the PluginDetail
ModifyLdapOperation opObj = (ModifyLdapOperation)
plgObj.getLdapOperation();
// Retrieve the LdapModification Object from the LdapOperation
LdapModification modObj = opObj.getLdapModification();
// Retrieve the PluginFlexfield Object from the PluginDetail
PluginFlexfield flxFldObj = plgObj.getPluginFlexfield();
// Retrieve the custom information from the PluginFlexfield
// Get the minimum password length
String passwdlength =
flxFldObj.getFlexfield("minPwdLength");
// Create a Result Object to return to the OID server
PluginResult plgResObj = new PluginResult();
// Check if the LdapModification Object is a NULL
// set the appropriate error and error message
if (modObj==null)
{
throw new PluginException("CheckPassword Plug-in Execution
Error");
}
// Retrieve the "userPassword" Attribute Value
ModificationItem modItem = modObj.getModificationItemAt(0);
BasicAttribute attr = (BasicAttribute)modItem.getAttribute();
String attrval = null;
if ((attr.getID()).equals("userpassword"))
attrval = attr.get(0);
// Check for the password length and set appropriate error
// and error message
if (attrval.length() < Integer.parseInt(passwdlength))
{
throw new PluginException("userPassword is less than 8
characters");
}
// Return the PluginResult Object to the OID Server
return plgResObj;
}
// Catch any unexpected exception which may occur and throw
// it back to the OID server to log it
catch (Exception e)
{
throw e;
}
}
}
この例では、Active Directoryの外部認証プラグインを説明します。クライアントがuserPasswordのldapcompare操作をリクエストすると、サーバーによりこのJavaプラグインが起動され、Active Directoryに対してユーザーが認証されます。
dn: cn=when_rep_comp,cn=plugin,cn=subconfigsubentry
orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com;
orclpluginflexfield;ad-host: dlin-pc2.us.example.com
orclpluginflexfield;ad-port: 3060
orclpluginflexfield;ad-su-dn: administrator@dlin.net
orclpluginflexfield;ad-su-passwd: password1
objectclass: orclPluginConfig
objectclass: top
orclpluginname: ExtAuthAD
orclplugintype: configuration
orclplugintiming: when
orclpluginisreplace: 1
orclpluginldapoperation: ldapcompare
orclpluginversion: 1.0.1
cn: when_rep_comp
orclpluginkind: Java
orclpluginenable: 1
public class ExtAuthAD extends ServerPluginAdapter {
public PluginResult when_compare_replace(PluginDetail plgObj)
throws Exception {
try {
// Retrieve the LdapOperation from the PluginDetail
CompareLdapOperation opObj =
(CompareLdapOperation) plgObj.getLdapOperation(); String baseDn = plgObj.getLdapBaseEntry().getDN();
// Retrieve the Base DN, Attribute and Attribute Value
String bdn = baseDn.substring(0,
baseDn.lastIndexOf("cn=users,dc=us,dc=oracle,dc=com")-1)
+",cn=users,dc=dlin,dc=net";
String ban = opObj.getAttributeName(); String bav = opObj.getAttributeValue().toString();
// Retrieve the AD Information from the PluginFlexfield
PluginFlexfield flxObj = plgObj.getPluginFlexfield();
String adhost = flxObj.getFlexfield("ad-host");
String adport = flxObj.getFlexfield("ad-port");
String adsudn = flxObj.getFlexfield("ad-su-dn");
String adsupasswd = flxObj.getFlexfield("ad-su-passwd");
// Create a PluginResult Object to return to the OID server
PluginResult plgResObj = new PluginResult();
// Create a Hashtable with values required to connect to AD
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://"+adhost+":"+adport);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, bdn);
env.put(Context.SECURITY_CREDENTIALS, bav);
// Try to connect to AD
DirContext dirContext = null;
try {
dirContext = new InitialDirContext(env);
if (dirContext != null) {
// User has been successfully authenticated, add the appropriate
// result code to the LdapOperation
opObj.setOperationResultCode(6);
}
}
catch(NamingException ne) {
// Unable to connect to the AD directory server with the given
// credentials, add the appropriate result code to the LdapOperation
opObj.setOperationResultCode(5);
}
// Add the LdapOperation to the PluginResult
plgResObj.setLdapOperation(opObj);
// Return the PluginResult
return plgResObj;
} catch(Exception e) {
// In case of any unexpected errors in the plug-in, throw the Exception
// back to the OID server to log it throw e;
}
}
}