XXVI. LDAP 関数

LDAP 入門

LDAP とは Lightweight Directory Access Protocol を意味し、 "ディレクトリ・サーバー" にアクセスするために使用される プロトコルです。 ディレクトリとは、ツリー構造に情報を保持している特殊な データベースのことです。

この概念は、ハードディスクのディレクトリ構造に似ています。 ただし、その内容は異なっており、ルートディレクトリは "世界" であり、 最初のレベルのサブディレクトリは "国" となります。 ディレクトリ構造の下位には、会社や機関、場所のエントリがあります。 さらに下位には、人やおそらく道具や文書に関するディレクトリエントリも あります。

ハードディスクにあるサブディレクトリにあるファイルを参照するには、 次のようにすることでしょう。


     /usr/local/myapp/docs
 

スラッシュは、リファレンスの各部分を区分し、解釈は左から右に行われます。

LDAP においてこの完全に正しいファイル参照に等価なものは "区分された名前(distinguished name)"であり、単に "dn" として 参照されます。 例として dn が次のようになっているとしましょう。


     cn=John Smith,ou=Accounts,o=My Company,c=US
 

カンマは各部分を区分し、右から左に解釈されます。 この dn は次のように解釈されます。


     country = US
     organization = My Company
     organizationalUnit = Accounts
     commonName = John Smith
 

ハードディスクのディレクトリ構造を管理する手法について明確な規約がないのと同様に、 ディレクトリサーバーマネージャーは、 目的に適したあらゆる構造を設定することが可能です。 しかし、実用的にはいくつかの慣習があります。 利用可能なものに関する情報を持たずにデータベースを使用する ことができないのと同様に ディレクトリの構造に関する情報なくして ディレクトリサーバーにアクセスするコードを書くことはできない ということが言えます。

完全なコードの例

あるディレクトリサーバーから姓が "S" から始まる全てのエントリに 関する情報を検索し、名前と電子メールアドレスで検索結果を表示します。

例 1. LDAP 検索の例

  1 
  2  <?php
  3  // LDAP の基本シーケンスは、接続、バインド、検索、検索結果の解釈、
  4  // 接続のクローズです。
  5  
  6  echo "<h3>LDAP query test</h3>";
  7  echo "Connecting ...";
  8  $ds=ldap_connect("localhost");  // 有効な LDAP サーバーに違いない!
  9  echo "connect result is ".$ds."<p>";
 10  
 11  if ($ds) { 
 12      echo "Binding ..."; 
 13      $r=ldap_bind($ds);     // これは "匿名" バインドで、通常は
 14                             // 読みこみのみのアクセスとなります。
 15      echo "Bind result is ".$r."<p>";
 16  
 17      echo "Searching for (sn=S*) ...";
 18      // Search surname entry
 19      $sr=ldap_search($ds,"o=My Company, c=US", "sn=S*");  
 20      echo "Search result is ".$sr."<p>";
 21  
 22      echo "Number of entires returned is ".ldap_count_entries($ds,$sr)."<p>";
 23  
 24      echo "Getting entries ...<p>";
 25      $info = ldap_get_entries($ds, $sr);
 26      echo "Data for ".$info["count"]." items returned:<p>";
 27  
 28      for ($i=0; $i<$info["count"]; $i++) {
 29          echo "dn is: ". $info[$i]["dn"] ."<br>";
 30          echo "first cn entry is: ". $info[$i]["cn"][0] ."<br>";
 31          echo "first email entry is: ". $info[$i]["mail"][0] ."<p>";
 32      }
 33  
 34      echo "Closing connection";
 35      ldap_close($ds);
 36  
 37  } else {
 38      echo "<h4>Unable to connect to LDAP server</h4>";
 39  }
 40  ?>
 41  

PHP LDAP コールの使用法

ミシガン大の ldap-3.3 パッケージまたはネットスケープのディレクトリ SDK のどちらかから 完全な LDAP クライアントライブラリを取得する必要があります。 また、PHP の LDAP コールを動作させるには、 PHP を LDAP サポートを有効にして再コンパイルする必要があります。

LDAP コールを使用する前に、以下のことを知っておいてください。

  • 使用するディレクトリサーバーの名前またはアドレス

  • サーバーの "base dn" (このサーバーがあるワールドディレクトリ の部分で、"o=My Company,c=US" のようにすることができます)

  • サーバーへのアクセスにパスワードを必要とするかどうか。 (多くのサーバーは "匿名バインド" に関して読みこみを 許可するが、他の処理についてはパスワードを要求します)

アプリケーションとして作成する LDAP コールのシーケンスは、 通常、次のようなパターンに沿っています。


   ldap_connect()    // サーバーへの接続を確立
      |
   ldap_bind()       // 匿名または認証された "ログイン"
      |
   ディレクトリの検索または更新等を行い、結果を表示する
      |
   ldap_close()      // "ログアウト"
 

他の情報

LDAP に関する多くの情報を以下の場所で得ることができます。

ネットスケープ SDK には、.html 形式の有用なプログラマー用ガイドが 含まれています。

目次
ldap_add — LDAP ディレクトリにエントリを付加する
ldap_mod_add — 現在の属性に属性を追加する
ldap_mod_del — 現在の属性から属性を削除する
ldap_mod_replace — 属性を新規の値に置換する
ldap_bind — LDAP ディレクトリにバインドする
ldap_close — LDAP サーバーへのリンクを閉じる
ldap_connect — LDAP サーバーへ接続する
ldap_count_entries — サーチ時のエントリ数をカウントする
ldap_delete — ディレクトリからエントリを削除する
ldap_dn2ufn — DN をユーザに分かりやすい名前のフォーマットに変換する
ldap_explode_dn — DN を構成要素毎に分割する
ldap_first_attribute — 最初の属性を返す
ldap_first_entry — 最初の結果 ID を返す
ldap_free_result — 結果メモリを開放する
ldap_get_attributes — サーチ結果エントリから属性を得る
ldap_get_dn — 結果エントリから DN を得る
ldap_get_entries — 全ての結果エントリを得る
ldap_get_values — 結果エントリから全ての値を得る
ldap_get_values_len — 結果エントリから全てのバイナリ値を得る
ldap_list — シングルレベル探索を行う
ldap_modify — LDAP エントリを修正する
ldap_next_attribute — 結果における次の属性を得る
ldap_next_entry — 次の結果エントリを得る
ldap_read — エントリを読み込む
ldap_search — LDAP ツリーを探索する
ldap_unbind — LDAP ディレクトリへのバインドを解除する
ldap_err2str — LDAP のエラー番号をエラーメッセージ文字列に変換する
ldap_errno — 直近の LDAP コマンドのLDAP エラー番号を返す
ldap_error — 直近のLDAPコマンドのLDAP エラーメッセージを返す