A.4 Javaサーバー・プラグイン開発者リファレンス
顧客と社内の両方からの要望に応え、オラクル社ではOracle Internet Directoryのサーバー・プラグイン・フレームワークにJava APIを追加しました。サーバー・チェーンなど、Oracle Internet Directoryの新機能のいくつかは、JavaプラグインAPIを使用して開発されました。
この付録の内容は次のとおりです。
A.4.1 Javaプラグインの利点
Java言語自体の利点に加え、Javaサーバー・プラグインには、PL/SQLプラグインに優る多くの利点があります
次のタイプです。
-
サーバーとプラグイン間の双方向通信
-
プラグインで検索結果を戻す機能
-
moddn
操作のサポート -
パフォーマンスの向上
-
データベースの知識が不要
-
セキュリティの強化
-
デバッグ機能の強化
A.4.2 Javaプラグインの設定
次のトピックの説明に従って、Javaプラグインを設定できます。
Javaプラグインを設定するには:
jarファイルには任意の名前を付けることができます。マニフェスト・ファイルには、後ろにJavaプラグインの名前が続く、属性Main-Classが含まれている必要があります。次に例を示します。
Main-Class: myjavaplugin
プラグイン構成エントリのorclPluginName
属性の値は、次のいずれかと対応している必要があります。
-
クラス・ファイル内のクラス名
-
パッケージ内のクラスの完全修飾名
-
jarファイル名
表A-3に、プラグイン名および対応するパスを示します。
前述のステップの実行後は、起動基準が満たされるたびに、サーバーによりプラグインが起動されます。
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
です。
A.4.3 orclPluginName値
orclPluginName
属性の値により、サーバーでクラスまたはjarファイルを検索する場所が決定されます。
表A-3に、いくつかの例を示します。
表A-3 プラグイン名および対応するパス
orclPluginName | パス |
---|---|
|
|
|
|
|
|
A.4.4 JavaプラグインAPIの概要
この項では、APIの概要を把握し、メイン・クラスやインタフェースの役割を理解します。
すべてのJavaサーバー・プラグイン・クラスおよびインタフェースの詳細は、『Oracle® Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。
この項の内容は次のとおりです。
ノート:
JavaプラグインではSystem.exit()を使用しないでください。使用すると、Oracleディレクトリ・サーバーが予期しない動作をする可能性があります。
A.4.4.1 サーバーとプラグイン間の通信
すべてのJavaプラグインでは、プラグインとOracle Internet Directoryサーバーとの通信にServerPlugin
インタフェースが使用されます。サーバーによりJavaプラグインが起動される際に、PluginDetail
オブジェクトが構成され、そのオブジェクトのプラグインに情報が渡されます。プラグインにより、PluginResult
オブジェクトが構成されます。タスクが完了すると、プラグインによりPluginResult
オブジェクトがサーバーに戻されます。プラグインにより、PluginDetail
から受信した情報に変更または追加が加えられ、PluginResult
オブジェクトに含めたその情報がサーバーに戻される場合もあります。図A-3は、Oracle Internet DirectoryサーバーとJavaプラグインの間の通信を示しています。
図A-3 サーバーとJavaプラグインの間の通信
![本文中で説明されています。 本文中で説明されています。](img/oimad020.gif)
Javaプラグインでは、ログ・ファイルにメッセージを記録するために、ServerLog
クラスも使用できます。
A.4.4.2 Javaプラグインの構造
次に、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 } }
A.4.4.3 PluginDetailの概要
PluginDetail
には、次の項で説明する情報が含まれます。
A.4.4.3.1 サーバー・オブジェクト
このオブジェクトには、プラグインが実行されるOracle Internet Directoryサーバーに関するメタデータ情報が含まれます。次の情報が含まれます。
-
Hostname
-
Port
-
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(…); …. }
例で使用されているメソッドの詳細は、『Oracle® Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。
A.4.4.3.2 LdapBaseEntry
表A-4 各LDAP操作のDN情報の内容
操作 | DNの内容 |
---|---|
ldapadd |
DNは送信されません |
ldapbind |
ディレクトリ・サーバーがバインドを試行するエントリ。 |
ldapcompare |
比較が実行されるベース・エントリ。 |
ldapdelete |
タイミングが前および操作時の場合に削除されるエントリ。 タイミングが後の場合、DNは送信されません。 |
ldapmoddn |
移動対象のベース・エントリ。 |
ldapmodify |
タイミングが前および操作時の場合に変更が行われるエントリ。 タイミングが後の場合に変更されるエントリ。 |
ldapsearch |
検索のベース・エントリ。 |
AttributesはJNDI属性です。
LdapBaseEntry
には、DNおよびAttributesにアクセスするためのメソッドがあります。LdapBaseEntry
がグループ・エントリで、エントリ・キャッシュ機能が無効な場合、パフォーマンス上の理由から、属性uniquemember
およびmember
にはアクセスできません。
関連項目:
『パフォーマンスのチューニング』のOracle Internet Directoryのパフォーマンスのチューニングに関する項。
A.4.4.3.3 LdapOperationの動作
この項では、LdapOperationとは何であるかを説明し、追加、バインド、削除、比較、検索、変更など様々な操作について説明します。
この項では、次の項目について説明します。
A.4.4.3.3.1 LDAP操作
すべてのプラグインは、add、bind、compare、delete、moddn、modifyまたはsearchの7つの基本的なLDAP操作のいずれかに関連付けられています。LdapOperation
オブジェクトには、次の情報が含まれ、7つのすべての操作に渡されます。
-
バインドDN
-
サーバー制御
-
Operation Result Code
Bind DNは、LDAP操作をリクエストするアイデンティティの識別名です。Server Controlsは、制御情報を含むベクターです。操作中に任意のサーバー・コントロールがサーバーに渡された場合、制御情報はServer ControlsのJavaプラグインに渡されます。表A-4に示すように、Operation Result Codeの内容は操作のタイミングによって異なります。操作時置換の場合、プラグインによるOperation Result Codeの情報の変更が可能で、その情報はPluginResult
に含められてサーバーに渡されます。
表A-5 Operation Result Codeの動作
プラグインのタイミング | Operation Result Codeの内容および動作 |
---|---|
前 操作時 |
使用しません |
操作時置換 |
プラグインによって行われたLDAP操作のエラー状態。プラグインからサーバーへの出力。 |
後 |
サーバーによって実行されたLDAP操作のエラー・ステータス。サーバーからプラグインへの入力です。 |
LdapOperation
には、コンテンツを取得および変更するためのメソッドもあります。
7つのLDAP操作を表す異なる7つのクラスにより、LdapOperation
クラスが拡張されます。各サブクラスには、LdapOperation
情報の他に、クラス固有の情報も含まれます。表A-6は、クラスおよびクラス固有の情報を示しています。表A-6の各クラス名は、そのクラスの詳細が説明されている項にリンクされています。
表A-6 LdapOperationのサブクラスおよびクラス固有の情報。
クラス | クラス固有の情報 |
---|---|
|
|
バインド・パスワード |
|
属性名 属性値 |
|
Delete DN |
|
New Parent DN New Relative DN Delete Old RDN New DN |
|
|
|
フィルタ 必須属性 有効範囲
|
各クラスには、情報を作成、変更および取得するためのメソッドもあります。クラス固有の情報は、プラグインへの入力またはプラグインからサーバーへの出力(あるいはその両方)を表します。
操作固有のクラスの詳細は、この項のこれ以降の部分で説明します。
A.4.4.3.3.2 AddLdapOperation
ldapaddプラグインの起動時に、サーバーにより、追加するエントリの情報を渡すためのLdapEntry
オブジェクトを含むAddLdapOperation
オブジェクトが構成されます。LdapEntryオブジェクトには、次の情報が含まれます。
-
DN
-
属性
DNは、追加するエントリの識別名を表します。Attributesは、エントリのJNDI属性です。表A-7に示すように、操作後を除くすべての操作で、プラグインによるLdapEntry
の情報の変更が可能で、その情報はサーバーに戻されます。
表A-7 各プラグインのタイミングに対するLdapEntry情報の動作
プラグインのタイミング | LdapEntry情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
A.4.4.3.3.3 BindLdapOperation
サーバーにより、ldapbindプラグインに次の情報が渡されます。
-
バインド・パスワード
-
Proxy Requester DN
Bind Passwordは、バインド用のパスワードです。Proxy Requester DNは、プロキシ・スイッチをリクエストするアイデンティティの識別名です。
A.4.4.3.3.4 CompareLdapOperation
サーバーにより、ldapcompareプラグインに次の情報が渡されます。
-
属性名
-
属性値
Attribute Nameは、ldapcompare操作中に比較される名前です。表A-8に示すように、操作後を除くすべての操作で、プラグインによるAttribute Nameの情報の変更が可能で、その情報はサーバーに戻されます。
表A-8 各プラグインのタイミングに対するAttributeNameの動作
プラグインのタイミング | Attribute Name情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
Attribute Valueは、ldapcompare操作中に比較される値です。表A-9に示すように、操作後を除くすべての操作で、プラグインによるAttribute Valueの情報の変更が可能で、その情報はサーバーに戻されます。
表A-9 各プラグインのタイミングに対するAttribute Valueの動作
プラグインのタイミング | Attribute Value情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
A.4.4.3.3.5 DeleteLdapOperation
サーバーはDelete DNオブジェクトをldapdeleteプラグインに渡します。これは削除される識別名です。表A-10に示すように、操作後を除くすべての操作で、プラグインによるDelete DNの情報の変更が可能で、その情報はサーバーに戻されます。
表A-10 各プラグインのタイミングに対するDelete DNの動作
プラグインのタイミング | DeleteDN情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
A.4.4.3.3.6 ModdnLdapOperation
サーバーにより、ldapmoddnプラグインに次の情報が渡されます。
-
New Parent DN
-
New Relative DN
-
Delete Old RDN
-
New DN
New Parent DNには、PluginDetail
のLdapBaseEntry
に指定されたRDNの新規の親が含まれます。表A-11に示すように、操作後を除くすべての操作で、プラグインによるNew Parent DNの情報の変更が可能で、その情報はサーバーに戻されます。
表A-11 各プラグインのタイミングに対するNew Parent DN情報の動作
プラグインのタイミング | New Parent DN情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
New Relative DNは、PluginDetail
のLdapBaseEntry
に指定されたRDNを置き換える新規のRDNです。表A-12に示すように、操作後を除くすべての操作で、プラグインによるNew Relative DNの情報の変更が可能で、その情報はサーバーに戻されます。
表A-12 各プラグインのタイミングに対するNew Relative DN情報の動作
プラグインのタイミング | New Relative DN情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
Delete Old RDN値には、PluginDetail
のLdapBaseEntry
に指定されている古いRDNを、新規の相対識別名に置き換えた後も格納するかどうかを指定します。表A-13に示すように、操作後を除くすべての操作で、プラグインによるDelete Old RDNの値の変更が可能で、その情報はサーバーに戻されます。
表A-13 各プラグインのタイミングに対するDelete Old RDN情報の動作
プラグインのタイミング | Delete Old RDN情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
New DNは、ldapmoddn操作のターゲット識別名を指定します。この情報は、サーバーからプラグインへの入力のみです。プラグインがこの情報を変更してサーバーに戻すことはできません。
A.4.4.3.3.7 ModifyLdapOperation
サーバーにより、ldapmodifyプラグインにLdapModification
オブジェクトが渡されます。LdapModification
オブジェクトには、JNDI変更アイテムであるModification Itemが含まれます。表A-14に示すように、操作後を除くすべての操作で、プラグインによるLdapModification
の情報の変更が可能で、その情報はサーバーに戻されます。
表A-14 各プラグインのタイミングに対するLdapModification情報の動作
プラグインのタイミング | LdapModification情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
A.4.4.3.3.8 SearchLdapOperation
SearchLdapOperation
オブジェクトには、次の情報が含まれます。
-
フィルタ
-
必須属性
-
有効範囲
-
SearchResultSet
Filter、Required AttributesおよびScopeはサーバーによって渡されます。
Filterには、ldapsearch操作に指定されたLDAP検索フィルタが含まれます。これは、プラグインへの入力のみです。プラグインがこの情報を変更してサーバーに戻すことはできません。
Required Attributesには、ldapsearch操作に指定された必須属性が含まれます。表A-15に示すように、操作後を除くすべての操作で、プラグインによるRequired Attributesの情報の変更が可能で、その情報はサーバーに戻されます。
表A-15 各プラグインのタイミングに対するRequired Attributesの動作
プラグインのタイミング | Required Attributes情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
Scopeには、ldapsearch操作により実行される検索の範囲が含まれます。表A-16に示すように、操作後を除くすべての操作で、プラグインによるScopeの情報の変更が可能で、その情報はサーバーに戻されます。
表A-16 各プラグインのタイミングに対するScopeの動作
プラグインのタイミング | Scope情報の動作 |
---|---|
前 操作時 操作時置換 |
入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。 |
後 |
入力のみ。 |
SearchResultSet
は、Javaプラグインからサーバーに戻される検索結果を定義します。ldapsearch操作を実行するプラグインは、このオブジェクトを構成できます。表A-17に示すように、SearchResultSetをサーバーに戻すことができるのは操作時プラグインと操作時置換プラグインのみです。
表A-17 各プラグインのタイミングに対するSearchResultSetの動作
プラグインのタイミング | SearchResultSet情報の動作 |
---|---|
前 |
このプラグインはオブジェクトを戻せません。 |
操作時 操作時置換 |
このプラグインは、サーバーにオブジェクトを戻すことができます。 |
後 |
このプラグインはオブジェクトを戻せません。 |
A.4.4.3.4 PluginFlexfield
プラグインを登録すると、プラグイン構成エントリにカスタム情報を格納できます。サーバーによりプラグインが起動される際に、この情報がプラグイン・フィールドPluginFlexfield
に渡されます。
構成エントリにカスタム情報を格納するためのスキーマ属性は3つあります。orclPluginFlexfield
属性にはテキスト情報を格納できます。格納するカスタム情報をさらに詳細に記録するには、サブタイプを使用できます。たとえば、サブタイプorclPluginFlexfield;ad-host
を使用して、プラグインが接続する必要のあるActive Directoryサーバーのホスト名を格納できます。
orclPluginBinaryFlexfield
属性には、バイナリ値を格納できます。サーバーではバイナリ属性の属性サブタイプがサポートされていないため、プラグインごとにorclPluginBinaryFlexfield
に格納できるのは1つの値のみです。
クリアテキストには表示しないカスタム・テキスト情報を格納するには、orclPluginSecuredFlexfield
を使用できます。値は暗号化形式で格納および表示されます。ユーザーがこの属性をクリアテキストで取得できないようにするため、Oracle Internet Directoryでは必ずプライバシ・モードを有効にします。「機密の属性のプライバシ・モードの有効化」を参照してください。格納するカスタム情報をさらに詳細に記録するには、サブタイプを使用できます。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
A.4.4.4 PluginResult
実行結果をサーバーに戻すため、JavaプラグインによりPluginResult
オブジェクトが構成され、そのオブジェクトがサーバーに渡されます。PluginResult
には、LdapOperation
またはその操作固有のサブクラスの1つの、いずれかのオブジェクトが含まれます。これらのオブジェクトは、「LdapOperationの動作」で説明しました。その項で説明しているように、操作およびタイミングによっては、PluginDetail
から受信したLdapOperationサブクラス・オブジェクトの情報をプラグインが変更可能で、そのオブジェクトはPluginResult
に含められてサーバーに戻されます。
A.4.4.5 LDAP操作のServerPluginインタフェース・メソッド
すべてのJavaプラグインでは、ServerPlugin
インタフェースが使用されます。このインタフェースには、サーバーと通信するための事前定義済のメソッドがあります。各LDAP操作およびタイミングに対して1つのメソッドがあります。各メソッドでは、PluginDetail
オブジェクトが入力として使用され、PluginResult
オブジェクトがOracle Internet Directoryサーバーに返されます。
ServerPluginAdapter
クラスは、ServerPlugin
インタフェースを実装します。ServerPluginAdapter
クラスには、デフォルト(NULL)で、ServerPlugin
メソッドが実装されています。このクラスを使用すると、すべてのメソッドを実装しなくてもJavaプラグインをコーディングできます。
この項のこれ以降では、各LDAP操作のServerPlugin
メソッドを示します。内容は次のとおりです。
A.4.4.5.1 Ldapbindの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;
A.4.4.5.2 LdapcompareのServerPluginメソッド
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;
A.4.4.5.3 LdapaddのServerPluginメソッド
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;
A.4.4.5.4 LdapmodifyのServerPluginメソッド
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;
A.4.4.5.5 LdapmoddnのServerPluginメソッド
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;
A.4.4.5.6 LdapsearchのServerPluginメソッド
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;
A.4.4.5.7 LdapdeleteのServerPluginメソッド
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
A.4.5 Javaプラグイン・エラーおよび例外処理の例
すべての未処理例外は、プラグインの実行中にOracle Internet Directoryサーバーによって捕捉されます。各例外の例外スタック・トレースおよびメッセージは、サーバー・ログ・ファイルに記録されます。
これらの例外は3つのカテゴリに分類されます。
-
ランタイム・エラーおよび例外は、不適切なプラグイン・コードまたはロジックが原因で発生します。Javaプラグインの実行中に生成されたすべてのランタイム・エラーおよび例外(
NullPointerException
など)は、サーバーにより捕捉されます。これらのエラーおよび例外は、サーバー・ログ・ファイルに記録されます。 -
プラグインによりスローされる予想される例外は、Oracle Internet Directoryサーバーのログ・ファイルに記録されます。また、例外はプラグインによって捕捉され、サーバー・ログ・ファイルに記録するためにサーバーにスローされます。
-
プラグインでは、
PluginException
クラスを使用してエラーを生成できます。PluginException
オブジェクトまたはそのサブクラスを使用してサーバーに渡されたエラー・メッセージは、LDAPクライアントに渡されます。このメッセージも、例外スタック・トレースおよびメッセージとともに、サーバーによりサーバー・ログ・ファイルに記録されます。
この項では、3つの例を説明します。次のタイプです。
A.4.5.1 ランタイム例外の例
次に、プラグインの実行中に生成される典型的な例外のログ・エントリを示します。
…. 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
A.4.5.2 ランタイム・エラーの例
このエラーは、プラグイン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
A.4.6 Javaプラグインのデバッグおよびロギング
プラグインでは、独自のログ・ファイルを保持し、そのファイルにリアルタイムで記録することが可能です。また、プラグインでは、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サーバーを起動する必要があります。
表A-18 Javaプラグインのロギングのデバッグ・レベル
Oracle Internet Directoryサーバーのデバッグ・レベル | デバッグ・レベルの内容 |
---|---|
134217728 |
Javaプラグイン・フレームワーク関連のすべてのJavaプラグイン・デバッグ・メッセージと内部サーバー・メッセージ |
268435456 |
|
402653184 |
上の両方 |
ServerLog.log()
メソッドはスレッド・セーフです。このメソッドを実行すると、パフォーマンスが低下する場合があります。
A.4.7 Javaプラグインの例
例を参考にしてJavaプラグインについて理解します。
次の項では、次の例を示します。
ノート:
JavaプラグインではSystem.exit()を使用しないでください。使用すると、Oracleディレクトリ・サーバーが予期しない動作をする可能性があります。
A.4.7.1 例1: パスワード検証プラグイン
この例では、ldapmodify操作の前にuserPassword
を検証するJavaプラグインを説明します。操作前
Javaプラグインは、Oracle Internet Directoryサーバーに登録されています。プラグイン構成には、そのプラグインで検証される最低限のパスワードの長さが含まれます。この情報は、orclPluginFlexfield
属性を使用して、プラグイン構成エントリに登録されます。サブタイプminPwdLength
には、最低限の長さが指定されます。この情報は、PluginFlexfield
を使用してプラグインに渡されます。orclPluginName
により、Oracle Internet Directoryサーバーにより起動されるJavaプラグインの名前が指定されます。
プラグインへの入力はPluginDetail
で、プラグインからの出力はPluginResult
です。
この項では、次の項目について説明します。
A.4.7.1.1 パスワード検証プラグインの構成エントリ
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
A.4.7.1.2 パスワード検証プラグインのコード例
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; } } }
A.4.7.2 例2: Active Directoryの外部認証プラグイン
この例では、Active Directoryの外部認証プラグインを説明します。クライアントがuserPassword
のldapcompare操作をリクエストすると、サーバーによりこのJavaプラグインが起動され、Active Directoryに対してユーザーが認証されます。
この項では、次の項目について説明します。
A.4.7.2.1 外部認証プラグインの構成エントリ
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
A.4.7.2.2 外部認証プラグインのコード
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; } } }