ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Identity Managementアプリケーション開発者ガイド
11g リリース1(11.1.1)
B56242-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 標準的なLDAP APIを使用したアプリケーションの開発

この章では、標準的なLDAP APIを使用して行うことのできる操作について概説します。また、アプリケーションをAPIと統合する方法も説明します。これらの説明の前に、Lightweight Directory Access Protocol(LDAP)について説明します。

この章では、次の項目について説明します。

2.1 LDAPの歴史

LDAPは、X.500 Directory Access Protocolに対する軽量フロントエンドとして開発されました。LDAPはX.500 Directory Access Protocolを次のように簡素化しています。

2.2 LDAPモデル

LDAPは次の項で説明する4つの基本モデルを使用して操作を定義します。

2.2.1 ネーミング・モデル

LDAPネーミング・モデルによって、ディレクトリ情報を参照および編成できます。ディレクトリ内の各エントリは、識別名(DN)で一意に識別されます。識別名は、ディレクトリ階層におけるそのエントリの位置を正確に伝えます。この階層は、ディレクトリ情報ツリー(DIT)を使用して表されます。

図2-1に、識別名とディレクトリ情報ツリーの関係を示します。

図2-1 ディレクトリ情報ツリー

本文で説明しています。

図2-1のDITは、Example Corporationに所属する、Anne Smithという同じ名前を持つ2人の従業員のエントリを示しています。この図のディレクトリ情報ツリーは、地理的および組織的な線で構造化されています。左の分岐で表されているAnne Smithは、米国の販売部門に勤務しています。もう一方は、英国のサーバー開発部門に勤務しています。

右の分岐で表されているAnne Smithには、Anne Smithという一般名(cn)があります。彼女は、Exampleという組織(o)の英国(uk)という国(c)のサーバー開発という組織単位(ou)に勤務しています。このAnne Smithエントリの識別名は次のとおりです。

cn=Anne Smith,ou=Server Development,c=uk,o=example

識別名の一般的な書式では、左に最下位のDITコンポーネントを置くことに注意してください。ルートに至るまで、次の上位コンポーネントが続きます。

識別名内の最下位コンポーネントは相対識別名(RDN)と呼ばれます。前述の識別名では、相対識別名はcn=Anne Smithです。Anne Smithの相対識別名のすぐ上のエントリに対応する相対識別名は、ou=Server Developmentです。また、ou=Server Developmentのすぐ上のエントリに対応する相対識別名はc=ukです。識別名は、このように各相対識別名をカンマで区切って順に並べたものです。

ディレクトリ情報ツリー全体の中で特定エントリの位置を識別する場合、クライアントは、その相対識別名のみではなく、エントリの完全な識別名を使用することによってそのエントリを一意に識別します。図2-1に示すグローバル組織の中で2人のAnne Smithを混同しないためには、それぞれの完全な識別名を使用します。同じ組織単位内に同じ名前の従業員が2人いる場合は、他のメカニズムを使用できます。たとえば、一意の識別番号でこれらの従業員を識別します。

2.2.2 情報モデル

LDAP情報モデルによって、ディレクトリ内の情報の形式や文字が決まります。このモデルでは、定義特性としてエントリという概念を使用します。ディレクトリのエントリとは、オブジェクトに関する情報の集合です。たとえば、電話帳には個人に関するエントリが含まれています。図書館カードの目録には、本に関するエントリが含まれています。オンライン・ディレクトリには、従業員、会議室、E-Commerceパートナ、またはプリンタなどの共有ネットワーク・リソースに関するエントリが含まれています。

一般的な電話帳の場合、個人に関するエントリには住所や電話番号などが含まれています。オンライン・ディレクトリでは、このような情報はそれぞれ属性と呼ばれます。一般的な従業員エントリには、役職名、電子メール・アドレス、電話番号などの属性が含まれています。

図2-2では、英国(uk)のAnne Smithに関するエントリにいくつかの属性があります。それぞれがAnne Smithについての固有の情報を提供します。ツリーの右側の円の中には、emailaddrsprinternamejpegPhotoおよびapp preferencesがリストされています。図2-2のその他の黒丸も属性を持つエントリですが、それらの属性は示していません。

図2-2 Anne Smithに関するエントリの属性

本文で説明しています。

各属性は、属性の型と1つ以上の属性値で構成されます。属性の型は、その属性に含まれている情報の種類(jobTitleなど)です。属性値は実際の情報です。たとえば、jobTitle属性に対する値にはmanagerがあります。

2.2.3 機能モデル

LDAP機能モデルによって、ディレクトリ・エントリに行える処理が決まります。表2-1に、3種類の機能をリストし、説明します。

表2-1 LDAPの機能

機能 説明

検索および読取り

読取り操作では、名前が判明しているエントリの属性を取得します。リスト操作では、指定したエントリの子を列挙します。検索操作では、検索フィルタと呼ばれる選択条件に基づいて、ツリー内に定義されている領域からエントリを選択します。一致した各エントリについて、リクエストされた属性のセットが(値の有無にかかわらず)戻されます。検索対象エントリの範囲は、単一のエントリ、エントリの子またはサブツリー全体にまで広げることができます。別名のエントリは、サーバーの境界を超えている場合でも、検索時に自動的に続行されます。中止操作を定義すると、進行中の操作を取り消すことができます。

変更

このカテゴリでは、ディレクトリを変更する4つの操作を定義します。

  • 変更: 既存のエントリを変更します。値の追加と削除が可能です。

  • 追加: ディレクトリにエントリを挿入します。

  • 削除: ディレクトリからエントリを削除します。

  • 相対識別名の変更: エントリの名前を変更します。

認証

このカテゴリでは、バインド操作を定義します。バインドによって、クライアントはセッションを開始し、そのアイデンティティをディレクトリに示すことができます。Oracle Internet Directoryは、単純なクリアテキストのパスワードから公開鍵まで、様々な認証方式をサポートしています。バインド解除操作によって、ディレクトリ・セッションを終了します。


2.2.4 セキュリティ・モデル

LDAPセキュリティ・モデルによって、ディレクトリの情報を保護できます。このモデルはいくつかの部分からなります。

  • 認証

    ユーザー、ホストおよびクライアントのアイデンティティが正しく検証されていることを保証する方法

  • アクセス制御と認可

    ユーザーが権限を持つ情報のみを読取りまたは更新することを保証する方法

  • データ整合性: 送信中にデータが変更されないことを保証する方法

  • データ・プライバシ

    送信中にデータが開示されないことを保証する方法

  • パスワード・ポリシー

    パスワードの使用方法を制御する規則を設定する方法

2.2.4.1 認証

認証は、ディレクトリ・サーバーが、そのディレクトリに接続するユーザーのアイデンティティを確認するプロセスです。ディレクトリ認証は、LDAPバインド操作でLDAPセッションを確立するときに行われます。すべてのセッションには関連付けられているユーザー・アイデンティティがあり、認可IDとも呼ばれます。

Oracle Internet Directoryには、匿名、簡易およびSSLの3つの認証オプションが用意されています。

2.2.4.1.1 匿名認証

ディレクトリをすべての人が使用できる場合、ユーザーは匿名でログインできます。匿名認証では、ユーザーはユーザー名とパスワードのフィールドを空白のままにしてログインします。そうすると、匿名ユーザーに対して指定されたすべての権限を使用できます。

2.2.4.1.2 簡易認証

簡易認証では、クライアントは暗号化されていない識別名とパスワードを使用し、サーバーに対して自己認証を行います。サーバーは、クライアントの識別名およびパスワードが、ディレクトリに格納されている識別名およびパスワードと一致していることを検証します。

2.2.4.1.3 Secure Sockets Layer(SSL)を使用した認証

Secure Sockets Layer(SSL)は、ネットワーク接続を保護するための業界標準プロトコルです。証明書の交換によりユーザーを認証します。これらの証明書は、信頼できる認証局によって検証されます。証明書は、エンティティのアイデンティティ情報が正しいことを保証します。エンティティには、エンド・ユーザー、データベース、管理者、クライアントまたはサーバーが可能です。認証局(CA)は、すべての関係機関によって高いレベルの信頼度を与えられた公開鍵の証明書を作成する機関です。

SSLは、表2-2に示す3つの認証モードで使用できます。

表2-2 SSL認証モード

SSLモード 説明

認証なし

クライアントとサーバーのいずれも、他方に対して自己認証を行いません。証明書の送信または交換は行われません。この場合は、SSL暗号化および復号化のみが使用されます。

一方向認証

ディレクトリ・サーバーのみ、クライアントに対して自己認証を行います。ディレクトリ・サーバーは、そのサーバーが認証されていることを証明する証明書をクライアントに送信します。

双方向認証

クライアントとサーバーは、相互に自己認証を行い、証明書を交換します。


Oracle Internet Directory環境では、クライアントとディレクトリ・サーバー間のSSL認証は次の3つの基本手順に従って行われます。

  1. ユーザーは、SSLポートでSSLを使用して、ディレクトリ・サーバーへのLDAP接続を開始します。デフォルトのSSLポートは3131です。

  2. SSLは、クライアントとディレクトリ・サーバー間のハンドシェイクを実行します。

  3. ハンドシェイクが成功すると、ディレクトリ・サーバーは、そのディレクトリにアクセスするために必要な認可をユーザーが所有していることを検証します。


    関連項目:

    SSLの詳細は、『Oracle Advanced Security管理者ガイド』を参照してください。


2.2.4.2 アクセス制御と認可

認可プロセスにより、ユーザーが権限を持つ情報のみを読取りまたは更新することが保証されます。ディレクトリ・サーバーは、特定のディレクトリ操作の実行に必要な権限が(セッションに関連付けられた認可IDによって識別された)ユーザーに与えられていることを確認します。必要な権限がないと、操作は実行できません。

適切な認可が行われていることを保証するためにディレクトリ・サーバーが使用するメカニズムは、アクセス制御と呼ばれます。また、アクセス制御項目(ACI)は、アクセス制御に関連する管理ポリシーを記録したディレクトリ・メタデータです。

ACIは、ユーザーが変更できる操作属性として、Oracle Internet Directoryに格納されています。通常、このACI属性値のリスト全体が1つのディレクトリ・オブジェクトに関連付けられています。このリストはアクセス制御リスト(ACL)と呼ばれます。このリストにある属性値によって、そのディレクトリ・オブジェクトに対するアクセス・ポリシーが管理されます。

ACIは、ディレクトリ内にテキスト文字列として格納されています。この文字列は、明確に定義された書式に従う必要があります。ACI属性の各有効値は、個別のアクセス制御ポリシーを表します。これらの個々のポリシーのコンポーネントは、ACIディレクティブまたはACIと呼ばれ、その書式はACIディレクティブ書式と呼ばれます。

アクセス制御ポリシーは規範的です。つまり、そのセキュリティ・ディレクティブは、ディレクトリ情報ツリー(DIT)内のすべての下位エントリに適用されるように設定できます。アクセス制御ポリシーが適用される開始点は、アクセス制御ポリシー・ポイント(ACP)と呼ばれます。

2.2.4.3 データ整合性

Oracle Internet Directoryは、SSLを使用して、送信中にデータの変更、削除または再実行が行われないことを保証します。この機能では、暗号化チェックサムを使用して、セキュアなメッセージ・ダイジェストを生成します。チェックサムは、MD5アルゴリズムまたはSecure Hash Algorithm(SHA)を使用して作成されます。メッセージ・ダイジェストは各ネットワーク・パケットに組み込まれます。

2.2.4.4 データ・プライバシ

Oracle Internet Directoryでは、SSLによる公開鍵暗号化を使用して、送信中にデータが開示されないことを保証します。公開鍵暗号では、メッセージの送信側が受信側の公開鍵を使用してメッセージを暗号化します。メッセージが送信されると、受信側は、受信側の秘密鍵を使用してメッセージを復号化します。ディレクトリは2つのレベルの暗号化をサポートしています。

  • DES40

    国際的に使用可能なDES40はDESの改良型で、秘密鍵を事前に処理して40ビットの有効な鍵を提供します。DES40は、米国およびカナダ以外でDESベースの暗号化アルゴリズムの使用を希望する顧客を対象に設計されています。

  • RC4_40

    Oracleは、Oracle製品が使用できる事実上すべての地域に対して、鍵のサイズが40ビットのRC4データ暗号化アルゴリズムを輸出するライセンスを取得しています。この結果、国際企業は、高速暗号化を使用して事業全体を保護することが可能になります。

2.2.4.5 パスワード・ポリシー

パスワード・ポリシーとは、パスワードの使用方法を制御する規則のセットです。ユーザーがディレクトリにバインドしようとすると、ディレクトリ・サーバーはパスワード・ポリシーを使用して、指定されたパスワードがポリシーに設定されている様々な要件を満たしていることを確認します。

パスワード・ポリシーを設定するときに、次のようなタイプの規則を設定します。

  • 指定のパスワードの最大有効期間

  • パスワードの最少文字数

  • ユーザーが自分のパスワードを変更できるかどうか

2.3 標準的なLDAP APIの概要

標準的なLDAP APIを使用すると、「LDAPモデル」で説明した基本的なLDAP操作を実行できます。このAPIには、C版、PL/SQL版およびJava版があります。最初の2つはディレクトリSDKに含まれています。もう1つはJNDIパッケージに含まれています。3つともTCP/IP接続を使用します。これらは、LDAPバージョン3に基づいており、Oracle Internet DirectoryへのSSL接続をサポートしています。

この項では、次の項目について説明します。

2.3.1 APIの使用モデル

一般的に、アプリケーションでは、次の4つの手順に従ってAPIのファンクションを使用します。

  1. ライブラリを初期化し、LDAPセッション・ハンドルを取得します。

  2. 必要に応じて、LDAPサーバーに対する認証を行います。

  3. いくつかのLDAP操作を実行し、その結果とエラー(ある場合)を取得します。

  4. セッションをクローズします。

図2-3に、これらの手順を示します。

図2-3 DBMS_LDAPの一般的な使用手順

本文で説明しています

2.3.2 C APIスタート・ガイド

C APIを使用してアプリケーションを作成する場合、$ORACLE_HOME/ldap/publicにあるヘッダー・ファイルldap.hをインクルードする必要があります。また、$ORACLE_HOME/lib/libclntsh.so.10.1にあるライブラリに動的にリンクすることも必要です。


関連項目:

SSLモードおよび非SSLモードの使用方法の詳細は、第8.3項「C APIの使用例」を参照してください。


2.3.3 DBMS_LDAPパッケージ・スタート・ガイド

DBMS_LDAPパッケージを使用すると、PL/SQLアプリケーションで、エンタープライズ・ワイドのLDAPサーバー内にあるデータにアクセスできます。ファンクション・コールの名前と構文は、C APIの場合と同様です。このファンクションは、C APIに関するInternet Engineering Task Force(IETF)の最新の推奨事項に準拠しています。ただし、PL/SQL APIに含まれるのは、C APIで使用できるファンクションの一部のみです。特に、PL/SQL APIで使用できるのは、LDAPサーバーへの同期コールのみです。

PL/SQL LDAP APIの使用を開始するには、次のコマンド・シーケンスを使用してDBMS_LDAPをデータベースにロードします。

  1. SQL*Plusを使用して、データベースにログインします。データベースが置かれているOracleホームにあるツールを実行します。SYSDBAとして接続します。

    SQL> CONNECT / AS SYSDBA
    
  2. 次のコマンドを使用して、APIをデータベースにロードします。

    SQL> @?/rdbms/admin/catladap.sql
    

2.3.4 Java APIスタート・ガイド

Java開発者は、Java Naming and Directory Interface(JNDI)を使用して、Oracle Internet Directoryの情報にアクセスできます。JNDIは次のリンクで提供されています。

http://www.oracle.com/technetwork/java/jndi/index.html

この章ではJava APIについて説明しませんが、第2.4.3項「JNDIを使用したセッションの初期化」で、JNDIに対するラッパー・メソッドを使用して基本的な接続を確立する方法を示します。

2.4 LDAPセッションの初期化

C APIに基づいたすべてのLDAP操作で、クライアントがLDAPサーバーとのLDAPセッションを確立することが求められます。PL/SQL APIに基づいたLDAP操作を実行するには、最初にデータベース・セッションを初期化してからLDAPセッションをオープンする必要があります。ほとんどのJava操作では、Java Naming and Directory Interface(JNDI)接続が必要になります。ここで説明するoracle.ldap.util.jndiパッケージは、この接続の確立に伴う作業を簡素化します。

この項の項目は次のとおりです。

2.4.1 C APIを使用したセッションの初期化

Cファンクションldap_init()は、LDAPサーバーとのセッションを初期化します。サーバーは、そのサーバーを必要とする操作が実行されるまで実際に接続されないため、初期化した後にオプションを設定できます。

ldap_initの構文は、次のとおりです。

LDAP *ldap_init
(
const char      *hostname,
int             portno
);

表2-3に、このファンクションのパラメータをリストし、説明します。

表2-3 ldap_init()のパラメータ

パラメータ 説明
hostname

ディレクトリ・ホスト名またはドット区切り文字列表記のIPアドレスを空白で区切ったリストが入ります。コロンで区切ることで各ホスト名にポート番号を組み合せることができます。

接続に成功するまで、ホストがリストの順序に従って試されます。

注意: リテラルIPv6[10]アドレスをhostnameパラメータに格納するための適切な表現が必要ですが、現在はまだ決定および実装されていません。

portno

接続先ディレクトリのTCPポート番号が入ります。デフォルトのLDAPポート3060は、定数LDAP_PORTを指定することで取得できます。ホストにポート番号が含まれている場合、このパラメータは無視されます。


ldap_init()およびldap_open()の戻り値は、そのセッションへの後続のコールに渡す必要がある不透明な構造体へのセッション・ハンドル(ポインタ)です。これらのルーチンは、セッションが初期化できない場合にNULLを戻します。オペレーティング・システムのエラー・レポート・メカニズムをチェックすると、コールに失敗した理由を確認できます。

2.4.2 DBMS_LDAPを使用したセッションの初期化

PL/SQL APIでは、ファンクションDBMS_LDAP.init()によりLDAPセッションを開始します。このファンクションの構文は、次のとおりです。

FUNCTION init (hostname IN VARCHAR2, portnum  IN PLS_INTEGER )
RETURN SESSION;

LDAPセッションを確立するには、initファンクションに有効なホスト名とポート番号が必要です。このファンクションは、そのためのデータ構造を割り当て、コール元にDBMS_LDAP.SESSIONタイプのハンドルを戻します。コールで戻されたハンドルは、DBMS_LDAPでセッションに定義された後続のすべてのLDAP操作で使用する必要があります。APIは、このセッション・ハンドルを使用して、オープン接続、未処理のリクエスト、その他の情報に関する状態をメンテナンスします。

アクティブな同時接続数は64に制限されていますが、1つのデータベース・セッションで必要な数のLDAPセッションを取得できます。複数のサーバーから同時にデータを取得する必要がある場合、または複数のLDAPアイデンティティを使用するオープン・セッションが必要な場合、1つのデータペース・セッションは、通常複数のLDAPセッションを持ちます。


注意:

DBMS_LDAP.init()のコールで戻されるハンドルは動的な構造体です。複数のデータベース・セッション間では存続しません。ハンドルの値を永続的なフォームに格納し、後で再利用すると、予測できない結果になる場合があります。


2.4.3 JNDIを使用したセッションの初期化

oracle.ldap.util.jndiパッケージは、JNDI実装に対するラッパー・メソッドを提供することで、基本的な接続をサポートします。JNDIを使用して接続を確立する場合は、次のリンクを参照してください。

http://www.oracle.com/technetwork/java/jndi/index.html

次に、非SSL接続を確立するoracle.ldap.util.jndiの実装を示します。

import oracle.ldap.util.jndi
import javax.naming.*;

public static void main(String args[])
{
  try{
       InitialDirContext ctx = ConnectionUtil.getDefaultDirCtx(args[0], // host
                                                         args[1],  // port
                                                         args[2],  // DN
                                                         args[3];  // password)
       // Do work
     }
  catch(NamingException ne)
  {
    // javax.naming.NamingException is thrown when an error occurs
  }
}

注意:

  • DNpasswordは、バインド識別名とパスワードを示します。匿名バインドの場合、これらを""に設定します。

  • ConnectionUtil.getSSLDirCtx()を使用すると、認証なしのSSL接続を確立できます。


2.5 LDAPセッションの認証

LDAPサーバーに対する操作を実行する個人またはアプリケーションは、最初に認証を受ける必要があります。これらのエンティティのdnパラメータおよびpasswdパラメータがNULLの場合、LDAPサーバーはanonymousと呼ばれる特別なアイデンティティをユーザーに割り当てます。通常、匿名ユーザーは最小限の権限を与えられたディレクトリ・ユーザーです。

バインド操作が完了すると、別のバインド操作が発生するか、LDAPセッションが終了する(unbind_s)まで、ディレクトリ・サーバーに新規のアイデンティティが保持されます。LDAPサーバーは、このアイデンティティを使用して、デプロイ先の企業で規定されたセキュリティ・モデルを実施します。このアイデンティティは、識別されたユーザーまたはアプリケーションがディレクトリ内で検索、更新または比較を行うための十分な権限を持っているかどうかをLDAPサーバーが判断するために役立ちます。

バインド操作用のパスワードは、ネットワーク上をクリアテキストで送信されます。ネットワークがセキュアでない場合は、認証とデータ転送を伴うその他のLDAP操作でSSLを使用することを検討してください。

この項では、次の項目について説明します。

2.5.1 C APIを使用したLDAPセッションの認証

Cファンクションldap_simple_bind_s()を使用すると、ユーザーとアプリケーションは、識別名とパスワードを使用してディレクトリ・サーバーへの認証を受けることができます。

ファンクションldap_simple_bind_s()の構文は、次のとおりです。

int ldap_simple_bind_s
(
LDAP* ld,
char* dn,
char* passwd
);

表2-4に、このファンクションのパラメータをリストし、説明します。

表2-4 ldap_simple_bind_s()の引数

引数 説明
ld

有効なLDAPセッション・ハンドルです。

dn

アプリケーションが認証で使用するアイデンティティ

passwd 

認証アイデンティティに対するパスワード


dnパラメータおよびpasswdパラメータがNULLの場合、LDAPサーバーはanonymousと呼ばれる特別なアイデンティティをユーザーまたはアプリケーションに割り当てます。

2.5.2 DBMS_LDAPを使用したLDAPセッションの認証

PL/SQLファンクションsimple_bind_sを使用すると、ユーザーとアプリケーションは、識別名とパスワードを使用してディレクトリへの認証を受けることができます。simple_bind_sの構文は、次のとおりです。

FUNCTION simple_bind_s ( ld IN SESSION, dn IN VARCHAR2, passwd IN VARCHAR2)
RETURN PLS_INTEGER;

このファンクションには、initで取得したLDAPセッション・ハンドルが最初のパラメータとして必要であることに注意してください。

次のPL/SQLコード・スニペットは、初期化と認証を行う前述のPL/SQLファンクションの実装方法を示しています。

DECLARE
retval    PLS_INTEGER;
my_session       DBMS_LDAP.session;
BEGIN
retval    := -1;
-- Initialize the LDAP session
my_session       := DBMS_LDAP.init('yow.example.com',3060);
--Authenticate to the directory
retval  :=DBMS_LDAP.simple_bind_s(my_session,'cn=orcladmin', 
'welcome');

前述の例では、LDAPセッションはLDAPサーバーyow.example.comで初期化されます。このサーバーは、TCP/IPポート番号3060でリクエストをリスニングします。次に、アイデンティティcn=orcladmin(パスワードはwelcome)が認証されます。認証が完了したら、通常のLDAP操作を開始できます。

2.6 ディレクトリの検索

検索は、最も一般的なLDAP操作です。アプリケーションは、複雑な検索条件を使用し、ディレクトリからエントリを選択して取得できます。

この項では、次の項目について説明します。

2.6.1 検索操作のプログラム・フロー

一般的な検索操作を開始して結果を取得するために必要なプログラミングは、次の手順で行います。

  1. 検索によって戻される属性を決定し、その属性を配列に入れます。

  2. 選択した有効範囲オプションとフィルタを使用して、検索を開始します。

  3. 結果セットからエントリを取得します。

  4. 手順3で取得したエントリから属性を取得します。

  5. 手順4で取得した属性の値を取得し、その値をローカル変数にコピーします。

  6. エントリのすべての属性が処理されるまで、手順4を繰り返します。

  7. すべてのエントリが処理されるまで、手順3を繰り返します。

図2-4に、フローチャートを使用してこれらの手順を示します。

図2-4 検索関連の操作の流れ

本文で説明しています

2.6.2 検索有効範囲

検索の有効範囲は、ディレクトリ・サーバーが検索ベースと比較して検証するエントリの数を決定します。表2-5および図2-5に示す3つのオプションのいずれかを選択できます。

表2-5 search_s()またはsearch_st()ファンクションのオプション

オプション 説明
SCOPE_BASE

ディレクトリ・サーバーは、検索ベースに対応しているエントリのみを検索します。

SCOPE_ONELEVEL

ディレクトリ・サーバーは、検索対象を検索ベース・エントリの直接の子エントリに限定します。

SCOPE_SUBTREE

ディレクトリ・サーバーは、検索ベース・エントリとその下のサブツリー全体を対象に検索します。


図2-5 3つの有効範囲オプション

本文で説明しています。

図2-5では、検索ベースはグレーの丸で表されています。検索対象のエントリは、薄い色の四角形で囲まれています。

2.6.3 フィルタ

検索フィルタは、検索対象を特定のタイプのエントリに限定するための式です。search_s()およびsearch_st()ファンクションに必要な検索フィルタは、Internet Engineering Task Force(IETF)のRFC 1960で定義されている文字列フォーマットに準拠しています。表2-6に示すように、6種類の検索フィルタがあります。これらは、attribute operator valueという書式で入力します。

表2-6 検索フィルタ

フィルタ・タイプ 書式 一致

等価

(att=value)
(sn=Keaton)

Keatonと完全に等しい姓。

近似

(att~=value)
(sn~=Ketan)

Ketanと近似の姓。

部分文字列

(attr=[leading]*[any]*[trailing]
(sn=*keaton*)
(sn=keaton*)
(sn=*keaton)
(sn=ke*at*on)

文字列keatonを含む姓。

keatonで始まる姓。

keatonで終わる姓。

keで始まり、atを含み、onで終わる姓。

以上

attr>=value
(sn>=Keaton)

辞書編集順でKeaton以降の姓。

以下

(attr<=value)
(sn<=Keaton)

辞書編集順でKeaton以前の姓。

存在

(attr=*)
(sn=*)

sn属性を持つすべてのエントリ。

拡張可能

attr[:dn]:=value
(sn:dn:=Mary Smith)

エントリまたはエントリのDNの姓属性がMary Smithと一致するすべてのエントリ。



注意:

  • Oracle Internet Directoryでは、拡張可能なフィルタをサポートしていますが、ldapsearchおよびOracle LDAP APIではサポートしていません。このタイプのフィルタを使用するには、JNDIなどの他のAPIを使用する必要があります。

  • Oracle Internet Directoryでは、フィルタで指定された一致規則を使用した拡張可能なマッチングはサポートされません。


ブール演算子や接頭辞表記法を使用してこれらのフィルタを組み合せると、より複雑なフィルタを構成できます。表2-7に例を示します。この例では、&文字はANDを、|文字はORを、!文字はNOTを表します。

表2-7 ブール演算子

フィルタ・タイプ 書式 一致

AND

(&(filter1)(filter2)). . .)
(&(sn=keaton)(objectclass=inetOrgPerson))

姓がKeaton、かつオブジェクト・クラスがInetOrgPersonのエントリ。

OR

(|(filter1)(filter2)). . .)
(|(sn~=ketan)(cn=*keaton))

姓がketanに近似しているか、または一般名がkeatonで終わるエントリ。

NOT

(!(filter))
(!(mail=*))

メール属性を持たないエントリ。


表2-7の複合フィルタを組み合せて、さらに複雑なネストしたフィルタを作成できます。


関連項目:

  • 『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』のLDAPフィルタの定義に関する付録

  • http://www.ietf.orgのRFC 2254

LDAPフィルタの詳細は、これらの資料を参照してください。


2.6.4 C APIを使用したディレクトリの検索

Cファンクションldap_search_s()は、ディレクトリの同期検索を実行します。

ldap_search_s()の構文は、次のとおりです。

int ldap_search_s
(
LDAP*         ld,
char*         base,
int           scope,
char*         filter
int           attrsonly,
LDAPMessage** res
);

ldap_search_sは、いくつかのサポート・ファンクションと連携して、検索対象を絞り込みます。次の手順は、これらのCファンクションが検索操作のプログラム・フローにどのように対応するかを示しています。第8章「C APIリファレンス」で、これらのファンクションの詳細を示します。

  1. 検索によって戻される属性を決定し、その属性を文字列の配列に入れます。配列はNULLで終了する必要があります。

  2. ldap_search_s()を使用して、検索を開始します。有効範囲オプションとフィルタで検索対象を絞り込みます。

  3. ldap_first_entry()ファンクションまたはldap_next_entry()ファンクションを使用して、結果セットからエントリを取得します。

  4. 手順3で取得したエントリから属性を取得します。これには、ldap_first_attribute()ファンクションまたはldap_next_attribute()ファンクションを使用します。

  5. 手順4で取得した属性のすべての値を取得し、その値をローカル変数にコピーします。これには、ldap_get_values()ファンクションまたはldap_get_values_len()ファンクションを使用します。

  6. エントリのすべての属性が処理されるまで、手順4を繰り返します。

  7. すべてのエントリが処理されるまで、手順3を繰り返します。

表2-8 ldap_search_s()の引数

引数 説明
ld

有効なLDAPセッション・ハンドルです。

base

検索のベースの識別名です。

scope

検索対象のDITの幅と深さです。

filter

検索対象のエントリを選択するためのフィルタです。

attrs

検索で戻されるエントリの属性です。

attrso

1に設定すると、属性のみが戻されます。

res

この引数は検索結果を戻します。


2.6.5 DBMS_LDAPを使用したディレクトリの検索

PL/SQL APIを使用する場合、ファンクションDBMS_LDAP.search_s()を使用してディレクトリ検索を実行します。

DBMS_LDAP.search_s()の構文は、次のとおりです。

FUNCTION search_s
(
ld       IN  SESSION,
base     IN  VARCHAR2,
scope    IN  PLS_INTEGER,
filter   IN  VARCHAR2,
attrs    IN  STRING_COLLECTION,
attronly IN  PLS_INTEGER,
res      OUT MESSAGE
)
RETURN PLS_INTEGER;

このファンクションは、表2-9に示す引数を取ります。

表2-9 DBMS_LDAP.search_s()およびDBMS_LDAP.search_st()の引数

引数 説明
ld

有効なセッション・ハンドルです。

base

検索を開始するLDAPサーバー内のベース・エントリの識別名です。

scope

検索対象のDITの幅と深さです。

filter

検索対象のエントリを選択するためのフィルタです。

attrs

検索で戻されるエントリの属性です。

attronly

1に設定すると、属性のみが戻されます。

res

追加処理を行うための結果セットを戻すOUTパラメータです。


search_sは、いくつかのサポート・ファンクションと連携して、検索対象を絞り込みます。次の手順は、すべてのPL/SQLファンクションが検索操作のプログラム・フローにどのように対応するかを示しています。

  1. 戻される属性を決定し、その属性をDBMS_LDAP.STRING_COLLECTIONデータ型に設定します。

  2. DBMS_LDAP.search_s()またはDBMS_LDAP.search_st()を使用して、検索を実行します。有効範囲オプションとフィルタで検索対象を絞り込みます。

  3. DBMS_LDAP.first_entry()またはDBMS_LDAP.next_entry()を使用して、結果セットからエントリを取得します。

  4. 手順3で取得したエントリから属性を取得します。これには、DBMS_LDAP.first_attribute()またはDBMS_LDAP.next_attribute()を使用します。

  5. 手順4で取得した属性のすべての値を取得し、その値をローカル変数にコピーします。これには、DBMS_LDAP.get_values()またはDBMS_LDAP.get_values_len()を使用します。

  6. エントリのすべての属性が処理されるまで、手順4を繰り返します。

  7. すべてのエントリが処理されるまで、手順3を繰り返します。

2.7 セッションの終了

この項では、次の項目について説明します。

2.7.1 C APIを使用したセッションの終了

LDAPセッション・ハンドルを取得し、ディレクトリ関連の作業をすべて完了した後は、LDAPセッションを破棄する必要があります。C APIでは、そのためにldap_unbind_s()ファンクションを使用します。

ldap_unbind_s()の構文は、次のとおりです。

int ldap_unbind_s
(
        LDAP*    ld
);

ldap_unbind_s()のコールが正常終了すると、ディレクトリへのTCP/IP接続がクローズします。また、LDAPセッションで使用されたシステム・リソースの割当てが解除されます。最後に、整数LDAP_SUCCESSがコール元に戻されます。ldap_unbind_s()を起動した後は、その他のLDAP操作は実行できません。ldap_init()を使用して新しいセッションを開始する必要があります。

2.7.2 DBMS_LDAPを使用したセッションの終了

PL/SQL APIが使用されている場合、DBMS_LDAP.unbind_s()ファンクションによりLDAPセッションを破棄します。unbind_sの構文は、次のとおりです。

FUNCTION unbind_s (ld IN SESSION )  RETURN PLS_INTEGER;

unbind_sにより、ディレクトリへのTCP/IP接続がクローズします。また、LDAPセッションで使用されたシステム・リソースの割当てが解除されます。最後に、整数DBMS_LDAP.SUCCESSがコール元に戻されます。unbind_sを起動した後は、その他のLDAP操作は実行できません。initファンクションを使用して新しいセッションを開始する必要があります。