LDAP APIプログラミング


目次
 

はじめに

LDAPオペレーション概要

同期/非同期の違い

検索の一般的なステップ

追加の概要

修正の概要

削除の概要

RDN修正の概要

比較の概要

エラー処理

LDAP URLの表記法

トピックス

Return to Directory Page


はじめに

このドキュメントは主な内容は下記の通り。

対象者

尚、より正確な情報を知りたい方は、「LDAPインターネットディレクトリアプリケーションプログラミング」の書籍やRFC1823等を参考にして頂きたい。

LDAPオペレーション概要

LDAPオペレーションとは、LDAPを使ってディレクトリに対して行う操作の総称のことである。NetscapeのSDK等でも、よく書かれている言い回しなので、割に一般的な用語と言える。内容は下記の通り。 様々なLDAP APIが世の中に出ているが、その中で一般的なLDAPv2のLDAPオペレーションの処理フローは下図の通り。
 
図.LDAPオペレーション概要
 
上図からわかるように、初期化、認証、切断(接続終了)というステップは、基本的に同じであり、異なるのは、LDAPオペレーションと記述のある箱の中身だけである。この中身には、上記にあるように、LDAPオペレーション(検索、比較....)が入る形になる。

注意としては、下記の点が挙げられる。
 

  • LDAPアプリケーションプログラミング時
  • LDAPサーバへの接続時
  • ちなみに、X.509認証を行う場合は、ldap_bind関数の認証方式にあたる引数に、強い認証方式を指定する(XX_STORONG_XX というようなマクロを指定する。)。


    同期/非同期の違い

    LDAP APIでは、同期関数と非同期関数というものを代表的な各々の関数に用意している。例えば、検索オペレーションに必要なldap_search関数には、同期用のldap_search_s関数と非同期用のldap_search関数とを用意している。ここでは、同期用関数と非同期用関数の違いについて簡単に説明する。
     

    同期用関数

    LDAPオペレーションでは、サーバが要求を完遂し、アプリケーションにすべてのエントリと最終結果のメッセージを返すまで、アプリケーションは処理を待たなければならない。即ち、この関数を呼び出すステップになったら、この関数が何らかの戻り値を返すまでは、次のステップに移ることができないということである。ただし、この関数を利用するとプログラムのステップが少なくなり、コーディングが簡単になる。
     

    非同期用関数

    非同期関数を使ったアプリケーションが要求した処理をディレクトリサーバが処理している間、そのアプリケーションは他の作業を行うことができる。LDAPのプロトコルに渡される各々のメッセージには、特定のセッションに対するユニークな番号である「メッセージID」を付与されている。LDAPのこの機能は、サーバに対して複数のコネクションを開かずに、同時にいくつものオペレーションを始めようとするような、複雑なアプリケーションをサポートするためのものである。非同期オペレーションが開始されると、ldap_result関数でオペレーションの状態を監視し、LDAPサーバが返す結果を取り出し、評価しなければならない。
     
     
    表.同期/非同期関数の比較
    同期用関数 非同期用関数
    関数の処理待ち時 当該関数の処理が終了するまで待つ 当該関数の結果をldap_result関数で監視する。その間、他の処理を行うことも可能。
    プログラムステップ 少ない 多い


    検索の一般的なステップ

    下図に同期/非同期の検索ステップを記述する。尚、ここでは初期化、認証、切断等の一連のステップは排除し、LDAPオペレーションの一つとしての記述をしている。簡単に言えば、下記のステップだけを実装しても、LDAPアプリケーションは動作しない。
     
    図.同期オペレーションの場合の検索処理
     
    上図に示した通り、同期用の検索関数を使用すると、下図にある非同期用の検索関数を使用した検索処理より少なく、単純なステップで処理フローが書かれているのがわかる。ディレクトリの概念的な構造の中で、大きな単位で抽象化されたデータの集まりをまず取得して、後に細かい単位のデータを取得して行くステップになっている。下記に図の補足説明を記す。
    図.非同期オペレーションの場合の検索処理

    開始点(ベースDN)

    検索を開始するエントリのDNを指定する。例えば、「o=himacs,c=JP」エントリ以下を検索対象としたい場合、ベースDNは、「o=himacs,c=jp」になる。

    検索スコープ

    検索する範囲を指定する。検索スコープに利用可能なパラメータは下記の値の中の一つである。
     
     
    表.検索スコープの一覧
    スコープに利用できる値 意味内容
    LDAP_SCOPE_SUBTREE ベースエントリとベースエントリ以下のすべてのエントリを検索範囲とする。
    LDAP_SCOPE_ONELEVEL ベースエントリの一つ下のレベルにあるすべてのエントリを検索範囲とする。ベースエントリは検索範囲の対象としない。
    LDAP_SCOPE_BASE ベースエントリだけを検索範囲とする。

    検索フィルタ

     
    表.検索フィルタのための基本オペレータ
    オペレータ
    詳細
    =   値と等しい属性を持つエントリを返す (cn=Barbara Jensen) 
    cn=Barbara Jensenエントリを見つける。
    >= 値以上の属性を持つエントリを返す (sn >=jensen) 
    sn=jensenからsn=z....のエントリ全てを見つける。
    <= 値以下の属性を持つエントリを返す (sn <=jensen) 
    sn=a....からsn=jensenのエントリすべてを見つける。
    =* その属性に値が設定されているエントリを返す (sn =*) 
    sn属性を持っているすべてのエントリを見つける。
    ~= 記入した値と大体一致している属性値を持つエントリを返す。典型的なものは、音が似ている言葉を一致しているというアルゴリズムである。 (sn ~=jensen) 
    sn=jansenエントリを見つける。
       
    表.検索フィルタのためのBooleanオペレータ
    Booleanオペレータ
    詳細
     & フィルタに記述した基準のすべてにマッチしたエントリを返す。
     | フィルタの基準の一つ以上にマッチしたエントリを返す。
     ! フィルタが真でないエントリを返す。このオペレータを一つのフィルタに適用することのみが可能である。           
    例えば、下記の様には使える。           
    (!(filter))           
    しかし、下記では使えない。           
    (!(filter1)(filter2))
     

    取得したい属性

    返される書式の設定

    エントリのソート

    検索関数を実行した後、ldap_sort_entries関数を使用して、ソートを行う。ただし、LDAPv2では、一つの属性値でしかソートできない。また、DNによってソートを行う場合は、注意が必要。

    属性のソート

    属性に対するソートは、ldap_sort_values関数を使用して行うことができる。この場合は、比較用の関数として、ldap_sort_strcasecmp関数が渡される。標準のstrcmp、strcasecmp関数では、関数の呼び出し方法が、ldap_sort_values関数からみると正しい呼び方で呼ばれないため、このような関数が存在するそうである。
     

    追加の概要

    追加したいエントリのDNとそのエントリに含まれる属性をldap_add関数に渡して実行すればよい。エントリの属性は、属性が文字列の場合は、LDAPMod構造体の各メンバに値を設定する。JPEGデータ等のイメージデータの場合は、LDAPMod構造体に値を設定し、さらに、berval構造体にも必要な値を設定する。


    修正の概要

    修正する処理は、追加する処理に良く似ている。修正する場合は、修正するエントリのDNとそのエントリに含まれている属性をldap_modify関数に渡して実行すれば良い。エントリの属性は、追加処理と同様に、属性が文字列の場合は、LDAPMod構造体の各メンバに値を設定する。JPEGデータ等のイメージデータの場合は、LDAPMod構造体に値を設定し、さらに、berval構造体にも必要な値を設定する。
     

    削除の概要

    削除したいエントリのDNをldap_delete関数に指定すれば、エントリの削除は、いとも簡単に終わってしまう。ただし、ディレクトリの途中のノードを削除することはできないことに注意が必要である。削除可能なエントリは、終端(リーフ)のエントリのみである。ディレクトリ途中のエントリから下のエントリすべてを削除したい場合は、終端からコツコツと一つずつエントリを削除して行くしか方法はない。
      

    RDN修正の概要

    RDNを何らかの理由で変更したい場合、ldap_modrdn2関数でRDNの変更を行うことが可能である。ただし、ディレクトリの途中にあるノードの変更は、単純にこの関数を呼んでも、うまくいかない。操作可能なのは、終端(リーフ)のエントリだけが操作可能である。ディレクトリの途中のノードを変更するには、工夫が必要である。
     

    比較の概要

    検索オペレーションとこの比較オペレーションは良く似ている。がしかし、根本的な違いが存在する。

    検索(比較)要求された属性が存在しない場合、検索オペレーションは、単にそのエントリを返さない。しかし、比較オペレーションは、LDAP_NO_SUCH_ATTRIBUTEというエラーが返される。要は、検索オペレーションは下記の違いを認識することができないが、比較オペレーションはそれを認識することが可能ということである。

    さらに、比較オペレーションは、プロトコルの面からみても、検索オペレーションより軽い。 これらの違いを意識しさえすれば、比較オペレーションは検索オペレーションを使ってエミュレート可能と言える。具体的には、ldap_compare関数を使えば良い。
     

    エラー処理


    LDAP URLの表記法

    LDAP URLは、ldap://のプロトコル接頭辞で始まり、LDAPサーバへ送る検索要求を付与しているURLである(もしくは、サーバがSSLコネクション上で会話を行う場合は、プロトコル接頭辞はldaps://である)。

    LDAP URLのコンポーネント

     
    表.LDAP URLのコンポーネントリスト
    コンポーネント
    詳細
    <hostname> LDAPサーバ(例えば、ldap.netscape.comか192.202.185.90)の名前(もしくはドット表記のIPアドレス)。
    <port> LDAPサーバのポート番号(例えば696)。ポート番号が記述されていなければ、標準LDAPポート(389)が使用される。
    <base_dn>   
     
    ディレクトリにあるエントリのDN。このDNは検索開始点のエントリを示す。このコンポーネントが無記入ならば、ルートDNから検索を開始する。
    <attributes> 返される属性。一つ以上の属性を記述するには、属性との境に、カンマを使用する(例えば、"cn,mail,telephoneNumber")。URLに属性が記述されていなければ、すべての属性が返される。
    <scope> 下記の値の内の一つの検索範囲。   
        
  • baseは、URLに記入したDN(<base_dn>)についての情報だけを検索する。
  • oneは、URLに記入したDN(<base_dn>)の下の一つのレベルのエントリについての情報を検索する。ベースエントリは、範囲に含まれていない。
  • subは、URLに記入したDN(<base_dn>)の下のすべてのレベルのエントリについての情報を検索する。ベースエントリはこの範囲に含まれている。
  • スコープを何も記入しない場合、サーバはbase検索を実行する。

    <filter>   
     
    記入した検索範囲の中のエントリに適用する検索フィルタ。フィルタを記入しない場合、サーバはフィルタ(objectClass=*)を使用する。
     

    LDAP URLの例

      LDAP URLの構文は、証明書やパスワードのための処理を含んでいない。検索要求は、認証 されていないLDAP URLを渡して、開始されている。

    トピックス

     


    Return to Top