4 標準的なAPIに対するOracleの拡張機能を使用したアプリケーションの開発
次の各トピックでは、JavaおよびPL/SQL LDAP APIに対するOracleの拡張機能について説明します。
4.1 標準的なAPIに対するOracleの拡張機能の理解
標準APIとOracleの拡張機能のAPIを使用して、ユーザー管理を実現できます。
次の各トピックでは、標準的なAPIに対するAPI拡張機能について説明します。
4.1.1 標準的なAPIに対するAPI拡張機能
ユーザー管理、グループ管理およびレルム管理を実現する、オラクル社が既存のAPIに追加したAPI。
機能は次のとおりです。
表4-1 機能と説明
機能 | 説明 |
---|---|
ユーザー管理 |
アプリケーションで各種ユーザー・プロパティを設定または取得できます。 |
グループ管理 |
アプリケーションでグループ・プロパティの問合せができます。 |
レルム管理 |
アプリケーションでアイデンティティ管理レルムに関するプロパティを設定または取得できます。 |
サーバー検出管理 |
アプリケーションでドメイン・ネーム・システム(DNS)のディレクトリ・サーバーの位置を特定できます。 |
この後の各項では、これらの機能を1つずつ詳細に解説します。一般的なタスク(接続の確立およびクローズ、APIの拡張機能で検索できないディレクトリ・エントリの検索など)については、基礎となるAPIをアプリケーションで使用する必要があります。
4.2 ディレクトリへのアプリケーション・アイデンティティの作成
アプリケーションがLDAP APIとその拡張機能を使用するためには、LDAP接続を確立する必要があります。
接続が確立されたら、操作を実行する権限を得る必要があります。しかし、アプリケーションのアイデンティティがディレクトリにない場合は、どちらのタスクも実行できません。
4.2.1 アプリケーションのアイデンティティの作成
ディレクトリにアプリケーションのアイデンティティを作成するのは比較的簡単です。このようなエントリに必要なのは、orclApplicationEntity
とtop
の2つのオブジェクト・クラスのみです。
Oracle Directory ManagerまたはLDIFファイルを使用してエントリを作成できます。LDIF表記法では、エントリは次のようになります。
dn: orclapplicationcommonname=application_name changetype: add objectclass:top objectclass: orclApplicationEntity userpassword: password
userpassword
に指定する値は、アプリケーションがディレクトリへのバインドに使用する値です。
4.2.2 アプリケーションのアイデンティティへの権限の割当て
正しい権限セットが特定できたら、アプリケーション・エンティティの識別名を適切なディレクトリ・グループに追加する必要があります。
アプリケーションに割り当てることのできる権限について学習するには、Oracle Fusion Middleware Oracle Internet Directory管理者ガイドのOracle Identity Managementのための権限の委任に関する項を参照してください。前述のドキュメントでは、Oracle Directory Services Managerまたはldapmodify
コマンドを使用してこのタスクを実行する方法が説明されています。
4.3 LDAP APIを使用したユーザー管理の機能
LDAP APIのユーザー管理機能は、ユーザー・エントリや拡張ユーザー・プリファレンスの取得などで役立ちます。
ディレクトリ対応アプリケーションは、次の操作を実行する必要があります。
-
ユーザー・エントリのプロパティの取得
このプロパティは、姓や自宅の住所などと同じ方法で、ユーザー・エントリ自体の属性として格納されています。
-
拡張ユーザー・プリファレンスの取得
このプリファレンスはユーザーに適用されますが、ユーザー・エントリを含むDITとは異なるDITに格納されています。拡張ユーザー・プリファレンスは、すべてのアプリケーションに共通のユーザー・プロパティ、または1つのアプリケーションに固有のユーザー・プロパティです。前者のタイプのプロパティは、Oracleコンテキストの共通の位置に格納されています。後者のタイプのプロパティは、アプリケーション固有のDITに格納されています。
-
ユーザーのグループ・メンバーシップの問合せ
-
単純な名前と資格証明が与えられたユーザーの認証
通常、アプリケーションは完全に修飾された識別名、GUIDまたは単純なユーザー名を使用してユーザーを識別します。ホスト環境では、ユーザー名とレルム名の両方を識別に使用することがあります。
4.4 Oracle Internet Directoryのグループの理解
Oracle Internet Directoryでは、グループは識別名の集合としてモデル化されます。ディレクトリ対応のアプリケーションは、グループのプロパティを取得し、特定のユーザーがそのグループのメンバーであることを検証するために、Oracle Internet Directoryにアクセスする必要があります。
通常、グループは次のいずれかを使用して識別されます。
-
完全に修飾されたLDAP識別名
-
Global Unique Identifier
-
単純なグループ名とサブスクライバ名
4.5 アイデンティティ管理レルムの理解
アイデンティティ管理レルムは、多数のOracle製品によって提供されるサービスをサブスクライブするエンティティまたは組織です。ディレクトリ対応のアプリケーションは、レルム・プロパティ(ユーザー検索ベースやパスワード・ポリシーなど)を取得するために、Oracle Internet Directoryにアクセスする必要があります。
通常、レルムは次のいずれかを使用して識別されます。
-
完全に修飾されたLDAP識別名
-
Global Unique Identifier
-
単純な企業名
4.6 ディレクトリ・サーバーの検出
ディレクトリ・サーバー検出(DSD)を使用すると、ディレクトリ・クライアントによってOracleディレクトリ・サーバーを自動検出できます。これにより、デプロイメント内で、ディレクトリのホスト名およびポート番号情報を中央のDNSサーバーで管理できます。
すべてのディレクトリ・クライアントが実行時にDNS問合せを行い、ディレクトリ・サーバーに接続します。ディレクトリ・サーバーの位置情報は、DNSサービス位置レコード(SRV)を使用して格納されます。
SRVには次のものが含まれます。
-
LDAPサービスを提供するサーバーのDNS名
-
対応するポートのポート番号
-
クライアントが複数のサーバーから適切なサーバーを選択できるようにする任意のパラメータ
また、DSDによって、クライアントがldap.ora
ファイル自体からディレクトリのホスト名情報を検出できます。
この項の内容は次のとおりです。
関連項目:
-
「Discovering LDAP Services with DNS」Michael P.Armijo著(次のURLを参照)
http://www.ietf.org
. -
「A DNS RR for specifying the location of services (DNS SRV)」、Internet RFC 2782(同じURLを参照)
4.6.1 Oracle Internet Directoryの検出インタフェースの利点
通常、LDAPホスト名およびポート情報は、$ORACLE_HOME/network/admin
のクライアント上に格納されているldap.ora
という名前のファイルで静的に提供されます。
多数のクライアントを持つ大規模なデプロイメントの場合、この情報の管理は非常に煩雑になります。たとえば、ディレクトリ・サーバーのホスト名またはポート番号が変更されるたびに、各クライアントのldap.ora
ファイルを変更する必要があります。
ディレクトリ・サーバー検出を使用すると、ldap.ora
ファイルのホスト名およびポート番号を管理する必要がなくなります。ホスト名情報は中央のDNSサーバーに格納されているため、更新するのは1回のみです。すべてのクライアントで、接続時にDNSから新しいホスト名情報を動的に検出できます。
DSDでは、取得する際に使用するメカニズムや規格にかかわらず、ディレクトリ・サーバー情報の取得に単一のインタフェースが提供されます。現在、Oracleディレクトリ・サーバーの情報は、DNSまたはldap.ora
のいずれかから単一のインタフェースを使用して取得できます。
4.6.2 検出インタフェースの検出ハンドルの作成
ホスト名情報を検出する最初のステップは、検出ハンドルを作成します。検出ハンドルは、ホスト名情報の検出元を指定します。Java APIの場合、検出ハンドルを作成するにはoracle.ldap.util.discovery.DiscoveryHelper
クラスのインスタンスを作成します。
DiscoveryHelper disco = new DiscoveryHelper(DiscoveryHelper.DNS_DISCOVER);
引数DiscoveryHelper.DNS_DISCOVER
は、ソースを指定します。この場合、ソースはDNSです。
各ソースには、ホスト名情報を検出するために指定するいくつかの入力項目があります。DNSの場合、入力項目は次のとおりです。
-
ドメイン名
-
検出メソッド
-
SSLモード
これらのオプションの詳細は、「DNSからのサーバー名およびポート番号の判断」を参照してください。
// Set the property for the DNS_DN disco.setProperty(DiscoveryHelper.DNS_DN,"dc=us,dc=fiction,dc=com"); // Set the property for the DNS_DISCOVER_METHOD disco.setProperty(DiscoveryHelper.DNS_DISCOVER_METHOD ,DiscoveryHelper.USE_INPUT_DN_METHOD); // Set the property for the SSLMODE disco.setProperty(DiscoveryHelper.SSLMODE,"0");
これで、情報を検出できます。
// Call the discover method disco.discover(reshdl);
検出された情報は、結果ハンドル(reshdl
)で戻されます。結果は、結果ハンドルから抽出されます。
ArrayList result = (ArrayList)reshdl.get(DiscoveryHelper.DIR_SERVERS); if (result != null) { if (result.size() == 0) return; System.out.println("The hostnames are :-"); for (int i = 0; i< result.size();i++) { String host = (String)result.get(i); System.out.println((i+1)+".'"+host+"'"); } }
4.6.3 DNSからのサーバー名およびポート番号の判断
DNSの検索からホスト名およびポート番号を判断するには、ドメインを取得した後、そのドメインに基づくSRVリソース・レコードを検索します。SRVリソース・レコードが複数存在する場合は、重み付けおよび優先順位に基づいてソートされます。SRVリソース・レコードには、接続に必要なホスト名およびポート番号が含まれます。この情報は、リソース・レコードから取得され、ユーザーに戻されます。
検索に必要なドメイン名の判断には、次の3つの方法があります。
-
ネーミング・コンテキストの識別名(DN)のマッピング
-
ローカル・マシンのドメイン・コンポーネントの使用
-
DNSでのデフォルトSRVレコードの検索
次の各トピックでは、前述の方法について説明します。
4.6.3.1 ネーミング・コンテキストの識別名の使用方法
1つ目は、ネーミング・コンテキストの識別名(DN)を、次のアルゴリズムを使用してドメイン名にマップする方法です。
最初は、出力されるドメイン名は空です。識別名は、右から順に処理されます。相対識別名(RDN)は、次の条件を満たす場合に変換できます。
-
単一の属性型および属性値で構成される。
-
属性型が
dc
である。 -
属性値がNULL以外である。
RDNを変換できる場合、属性値がドメイン名コンポーネント(ラベル)として使用されます。
最初の値が、右側の最も重要なドメイン名コンポーネントになります。変換された後続のRDN値が左側に追加されます。RDNを変換できない場合、処理は停止します。処理の停止時に出力されたドメイン名が空であった場合、DNはドメイン名に変換されません。
DNがcn=John Doe,ou=accounting,dc=example,dc=net
の場合、クライアントによって、dcコンポーネントがDNS名example.net
に変換されます。
4.6.3.2 ローカル・マシンのドメイン・コンポーネントの使用
DNをドメイン名にマップできない場合もあります。たとえば、DNがo=Oracle IDC,Bangalore
の場合、ドメイン名にはマップできません。この場合、2つ目の方法として、クライアントが実行されているローカル・マシンのドメイン・コンポーネントを使用します。たとえば、クライアント・マシンのドメイン名がmc1.example.com
の場合、検索に使用するドメイン名はexample.com
です。
4.6.3.3 DNSでのデフォルトSRVレコードの使用方法
3つ目は、DNSでデフォルトSRVレコードを検索する方法です。このレコードは、デプロイメント内のデフォルト・サーバーを指しています。このデフォルト・レコードのドメイン・コンポーネントは、_default
です。
ドメイン名が判断されると、DNSへの問合せの送信に使用されます。DNSに対して、Oracle Internet Directory固有の形式で指定されているSRVレコードが問い合されます。たとえば、取得されたドメイン名がexample.net
の場合、SSL LDAP以外のサーバーに対して、所有者名が_ldap._tcp._oid.example.net
のSRVリソース・レコードが問い合せられます。
DNSからSRVリソース・レコードが戻されない場合もあります。このような場合、DNSでの検索は、標準形式で指定されたSRVリソース・レコードに対して実行されます。たとえば、所有者名は_ldap._tcp.example.net
となります。
問合せの結果は、SRVレコードのセットです。これらのレコードはソートされ、レコードからホスト情報が抽出されます。抽出された情報はユーザーに戻されます。
ノート:
前述の方法は、DNSの問合せ検索が成功して停止するまで、連続して試行することができます。これらの方法は、この項で説明した順序で試行されます。DNSに対して、Oracle Internet Directory固有の形式のSRVレコードのみが問い合されます。前述のいずれの方法も失敗する場合、DNSに対して標準形式のSRVレコードのみの問合せを指定して、すべての方法が再度試行されます。
4.6.4 DNSサーバー検出の環境変数
環境変数により、DNSサーバー検出のデフォルト動作が変更されます。
次の表に、環境変数の説明を示します。
表4-2 DNS検出の環境変数
環境変数 | 説明 |
---|---|
ORA_LDAP_DNS |
SRVレコードを含むDNSサーバーのIPアドレス。この変数を定義しない場合、ホスト・マシンからDNSサーバー・アドレスが取得されます。 |
ORA_LDAP_DNSPORT |
DNSサーバーが問合せをリスニングするポート番号。この変数を定義しない場合、DNSサーバーが標準のポート番号( |
ORA_LDAP_DOMAIN |
ホスト・マシンのドメイン。この変数を定義しない場合、ホスト・マシン自身からドメインが取得されます。 |
4.6.5 DNSサーバー検出のプログラミング・インタフェースの概要
ディレクトリ・サーバー情報の検出には、取得する際に使用するメカニズムや規格にかかわらず、単一のプログラミング・インタフェースが提供されます。情報は、様々なソースから検出される場合があります。
それぞれのソース独自のメカニズムを使用して情報を検出できます。たとえば、LDAPホストおよびポート番号情報は、ソースとして機能するDNSから検出される場合があります。この場合は、DNSからのホスト名の検出にDSDが使用されます。
関連項目:
リファレンス情報およびクラスの説明については、プロダクトCDに格納されているJavadocを参照してください。