LXXIII. 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 環境でこの拡張モジュールを有効にするには、 PHP/Win32 バイナリパッケージの DLL フォルダから Windows マシンの SYSTEM32 フォルダ(例: C:\WINNT\SYSTEM32 または C:\WINDOWS\SYSTEM32) に DLL ファイルをコピーする必要があります。 PHP <= 4.2.0ならば libsasl.dll 、PHP <= 4.3.0 ならば libeay32.dll ssleay32.dll を SYSTEM32 フォルダにコピーしてください。

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

実行時設定

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

表 1. LDAP 設定オプション

名前 デフォルト 変更の可否 変更履歴
ldap.max_links "-1" PHP_INI_SYSTEM  
PHP_INI_* 定数の詳細および定義については 付録G を参照してください。

リソース型

リソース型は定義されていません。

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが 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_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" から始まる全てのエントリに 関する情報を検索し、名前と電子メールアドレスで検索結果を表示します。

例 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()      // "ログアウト"

目次
ldap_8859_to_t61  --  8859 文字を t61 文字に変換する
ldap_add  -- LDAP ディレクトリにエントリを付加する
ldap_bind  -- LDAP ディレクトリにバインドする
ldap_close  --  ldap_unbind() のエイリアス
ldap_compare  --  DN で指定したエントリで見付かった属性の値を比較する
ldap_connect  -- LDAP サーバへ接続する
ldap_count_entries  -- サーチ時のエントリ数をカウントする
ldap_delete  -- ディレクトリからエントリを削除する
ldap_dn2ufn  --  DN をユーザに分かりやすい名前のフォーマットに変換する
ldap_err2str  --  LDAP のエラー番号をエラーメッセージ文字列に変換する
ldap_errno  --  直近の LDAP コマンドの LDAP エラー番号を返す
ldap_error  --  直近の LDAP コマンドの LDAP エラーメッセージを返す
ldap_explode_dn  -- DN を構成要素毎に分割する
ldap_first_attribute  -- 最初の属性を返す
ldap_first_entry  --  最初の結果 ID を返す
ldap_first_reference  --  最初のリファレンスを返す
ldap_free_result  -- 結果メモリを開放する
ldap_get_attributes  -- サーチ結果エントリから属性を得る
ldap_get_dn  -- 結果エントリから DN を得る
ldap_get_entries  -- 全ての結果エントリを得る
ldap_get_option  -- 指定したオプションの現在の値を得る
ldap_get_values_len  -- 結果エントリから全てのバイナリ値を得る
ldap_get_values  -- 結果エントリから全ての値を得る
ldap_list  -- シングルレベル探索を行う
ldap_mod_add  -- 現在の属性に属性を追加する
ldap_mod_del  -- 現在の属性から属性を削除する
ldap_mod_replace  -- 属性を新規の値に置換する
ldap_modify  -- LDAP エントリを修正する
ldap_next_attribute  -- 結果における次の属性を得る
ldap_next_entry  -- 次の結果エントリを得る
ldap_next_reference  --  次のリファレンスを得る
ldap_parse_reference  --  参照エントリから情報を展開する
ldap_parse_result  --  結果から情報を展開する
ldap_read  -- エントリを読み込む
ldap_rename  -- エントリ名を修正する
ldap_sasl_bind  --  SASL を使用して LDAP ディレクトリにバインドする
ldap_search  -- LDAP ツリーを探索する
ldap_set_option  -- 指定したオプションの値を設定する
ldap_set_rebind_proc  --  参照先を再バインドするためのコールバック関数を設定する
ldap_sort  --  LDAP 結果エントリをソートする
ldap_start_tls  --  TLS を開始する
ldap_t61_to_8859  --  t61 文字を 8859 文字に変換する
ldap_unbind  -- LDAP ディレクトリへのバインドを解除する