Forum und email

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
    

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

LDAP に関する多くの情報が以下の場所にあります。

Netscape SDK では、有用な » プログラマーズガイド が HTML 形式で公開されています。

要件

LDAP サポートを有効にして PHP をコンパイルするには、 » OpenLDAP あるいは » Bind9.net から LDAP クライアント ライブラリを入手し、コンパイルしておく必要があります。

インストール手順

PHP の LDAP サポートはデフォルトで有効になっていません。 LDAP サポートを有効にして PHP をコンパイルするには、設定オプション --with-ldap[=DIR] を指定して PHP をコンパイルする必要があります。 DIR は LDAP をインストールしたディレクトリです。 SASL サポートを有効にするためには、システム上に sasl.h を用意し、 --with-ldap-sasl[=DIR] を指定する必要があります。

注意: Win32 ユーザへの注意 この拡張モジュールを動作させるには、 Windows システムの PATH が通った場所に DLL ファイルが存在する必要があります。 FAQ の "Windows で PHP のディレクトリを PATH に追加するにはどうすればいいのですか?" で、その方法を説明しています。 DLL ファイルを PHP のフォルダから Windows のシステムディレクトリにコピーしても動作します (システムディレクトリは、デフォルトで PATH に含まれるからです) が、これは推奨しません。 この拡張モジュールを使用するには、以下のファイルが PATH の通った場所にある必要があります。 libeay32.dll および ssleay32.dll
PHP 4.3.0 より前のバージョンでは、さらに libsasl.dll も必要です。

Oracle LDAP ライブラリを使用するには、Oracle 環境 が適切に設定されている 必要があります。

実行時設定

php.ini の設定により動作が変化します。

LDAP 設定オプション
名前 デフォルト 変更の可否 変更履歴
ldap.max_links "-1" PHP_INI_SYSTEM  
PHP_INI_* 定数の詳細および定義については php.ini ディレクティブ を参照してください。

リソース型

ほとんどの LDAP 関数は、リソースを操作するか、あるいはリソースを返します (たとえば ldap_connect() は正の LDAP リンク ID を返し、ほとんどの LDAP 関数はそれを使用します)。

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

LDAP_DEREF_NEVER (integer)
LDAP_DEREF_SEARCHING (integer)
LDAP_DEREF_FINDING (integer)
LDAP_DEREF_ALWAYS (integer)
LDAP_OPT_DEREF (integer)
LDAP_OPT_SIZELIMIT (integer)
LDAP_OPT_TIMELIMIT (integer)
LDAP_OPT_NETWORK_TIMEOUT (integer)
ldap_set_option() 用のオプションで、ネットワークのタイムアウトを設定します (PHP 5.3.0 以降で利用可能です)。
LDAP_OPT_PROTOCOL_VERSION (integer)
LDAP_OPT_ERROR_NUMBER (integer)
LDAP_OPT_REFERRALS (integer)
LDAP_OPT_RESTART (integer)
LDAP_OPT_HOST_NAME (integer)
LDAP_OPT_ERROR_STRING (integer)
LDAP_OPT_MATCHED_DN (integer)
LDAP_OPT_SERVER_CONTROLS (integer)
LDAP_OPT_CLIENT_CONTROLS (integer)
LDAP_OPT_DEBUG_LEVEL (integer)
GSLC_SSL_NO_AUTH (integer)
GSLC_SSL_ONEWAY_AUTH (integer)
GSLC_SSL_TWOWAY_AUTH (integer)

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

Example#1 LDAP 検索の例

<?php
// LDAP の基本シーケンスは、接続、バインド、検索、検索結果の解釈、
// 接続のクローズです。

echo "<h3>LDAP query test</h3>";
echo 
"Connecting ...";
$ds=ldap_connect("localhost");  // 有効な LDAP サーバーに違いない!
echo "connect result is " $ds "<br />";

if (
$ds) { 
    echo 
"Binding ..."
    
$r=ldap_bind($ds);     // これは "匿名" バインドで、通常は
                           // 読みこみのみのアクセスとなります。
    
echo "Bind result is " $r "<br />";

    echo 
"Searching for (sn=S*) ...";
    
// 名前(surname)エントリを検索
    
$sr=ldap_search($ds"o=My Company, c=US""sn=S*");  
    echo 
"Search result is " $sr "<br />";

    echo 
"Number of entires returned is " ldap_count_entries($ds$sr) . "<br />";

    echo 
"Getting entries ...<p>";
    
$info ldap_get_entries($ds$sr);
    echo 
"Data for " $info["count"] . " items returned:<p>";

    for (
$i=0$i<$info["count"]; $i++) {
        echo 
"dn is: " $info[$i]["dn"] . "<br />";
        echo 
"first cn entry is: " $info[$i]["cn"][0] . "<br />";
        echo 
"first email entry is: " $info[$i]["mail"][0] . "<br /><hr />";
    }

    echo 
"Closing connection";
    
ldap_close($ds);

} else {
    echo 
"<h4>Unable to connect to LDAP server</h4>";
}
?>

PHP LDAP コールの使用法

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

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

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

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

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

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

目次