Oracle Fusion Middleware Oracle Internet Directory管理者ガイド 11g リリース1(11.1.1) B55919-02 |
|
前 |
次 |
顧客と社内の両方からの要望に応え、オラクル社では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を使用して追加できます。詳細は、「コマンドラインでのプラグインの登録」および「Oracle Directory Services Managerを使用したプラグインの管理」を参照してください。
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では必ずプライバシ・モードを有効にします。「受信した機密の属性のプライバシの構成」を参照してください。格納するカスタム情報をさらに詳細に記録するには、サブタイプを使用できます。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つの、いずれかのオブジェクトが含まれます。これらのオブジェクトは「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; } } }