PHPアクセスLDAP

13514 ワード

LDAPのフルネームは「ライト級ディレクトリアクセスプロトコル(Lightweight Directory Access Protocol)」であり、簡単なディレクトリプロトコルである.ディレクトリとは、任意のアプリケーションにサービスを提供するための専用のデータベースです.エンタープライズアプリケーションでLDAPを使用すると、オペレーティングシステムやサーバのタイプに限定されることなく、エンタープライズ範囲内のすべてのアプリケーションLDAPディレクトリから情報を取得できます.ここでは主にPHPを使用してLDAPにアクセスする方法について説明します.
LDAPディレクトリの情報は,ツリー型構造に従って組織され,具体的な情報はエントリ(entry)のデータ構造に格納される.エントリは、リレーショナル・データベース内のテーブルのレコードに相当します.エントリは、区別名DN(Distinguished Name)を持つ属性(Attribute)であり、DNはエントリを参照するために使用され、DNはリレーショナル・データベース・テーブルのキーワード(Primary Key)に相当する.
LDAP略称対応
1.o-organization
2.ou-organization unit
3.c- countryName
4.dc-domainComponent
5.sn-suer name
6.cn-common name
LDAPサーバへの接続
PHPでLDAPサーバに接続するための関数の場合ldap_connect、構文フォーマットは次のとおりです.
ldap_connect([string hostname [, int port]])
ここで、hostnameはLDAPサーバが存在するホストアドレスであり、portはLDAPサーバのポート番号である.以下のコードは、192.168に位置するペアを実現する.3.1アドレスのサーバー接続.
<?PHP
$ldap_host = "ldap:192.168.3.1";//LDAP     
$ldap_port = "389";
$ldap_conn = ldap_connect($ldap_host,$ldap_port) or die ("Can't connect to LDAP server");//   LDAP     
?>

LDAPサーバのバインド
LDAPサーバのバインドは、特定のユーザ名またはパスワードを使用してLDAPサーバにログインすることを意味します.PHPでLDAPサーバをバインドするための関数はldap_bind、その構文フォーマットは以下の通りです.
ldap_bind(ldap_conn[,string username [, string password]])
ldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトであり、usernameはLDAPサーバにログインしたときに使用されるユーザ名であり、passwordはログイン時に使用されるパスワードである.以下のコードは、198.168に位置する.3.1アドレスのLDAPサーバのバインド.
<?php
$ldap_host = "ldap:192.168.3.1";//LDAP   
$ldap_port = "386";//LDAP      
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ladp_connect($ldap_host,$ladp_port) or die("Can't connect to the LDA server.");
$ldap_bind($ldap_conn,$ldap_user,$ldap_pwd) or die("Can't bind to LDAP server.");
?>
LDAPサーバの切断
LDAPサーバが切断されたプロセスは、LDAPサーバをバインドするのとは反対に、PHPでLDAPサーバをバインドするために使用される関数の場合ldap_unbind、その構文フォーマットは以下の通りです.
ldap_unbind(ldap_conn)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトです.以下のコードは、ペア192.168にバインド.3.1アドレスのLDAPサーバが接続解除されます.
<?PHP
$ldap_host = "ldap://192.168.3.1";
$ldap_user = "";
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server");
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server.");
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server.");
?>

LDAPディレクトリの内容を問い合わせる
LDAPディレクトリのクエリーldap_を使用search関数を実装し,その構文フォーマットを以下に示す.
ldap_search(ldap_conn,base_dn,conditions)
ldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトです.base_dnはLDAPサーバのクエリー・プライマリ・キーです.conditionsは、LDAPディレクトリクエリに使用される条件です.この関数は、クエリーされたすべてのレコードを保存する結果オブジェクトを返します.この結果オブジェクトではldap_を使用できます.get_entries関数は、構文フォーマットを以下に示す簡単な読み取りを行います.
ldap_get_entries(ldap_conn,result)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトであり、resultは、前にLDAPディレクトリをクエリーしたときに返されるオブジェクトです.この関数は、すべての結果レコードを含む配列を返します.次のコードは、サーバ上のコンテンツのクエリーを実現します.
<?php
$ldap_host = "ldap://192.168.3.1";//LDAP      
$ldap_port = "389";//LDAP       
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server");//    LDAP       
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server.");//      
$base_dn = "ou=company,o=depart";//            
$filter_col = "mail";//        
$filter_val = "[email protected]";//        
$result= ldap_search($ldap_conn, $base_dn, "($filter_col=$filter_val)");
$entry= ldap_get_entries($ldap_conn, $result);//      
print_r($entry);
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server."); //        
?>

運転結果は以下の通りです.
Array
(
[count] => 1
[0] => Array
(
[objectclass] => Array
(
[count] => 5
[0] => person
[1] => organizationalPerson
[2] => companyPerson
[3] => departPerson
[4] => top
)
[0] => objectclass
[ou] => Array
(
[count] => 1
[0] => company
)
[1] => ou
[o] => Array
(
[count] => 1
[0] => depart
)
[2] => o
[employeeserialnumber] => Array
(
[count] => 1
[0] => 100001
)
[3] => employeeserialnumber

[givenname] => Array
(
[count] => 2
[0] => Peng Cheng
[1] => Peng
)
[4] => givenname
[mail] => Array
(
[count] => 1
[0] => [email protected]
)
[5] => mail
[count] => 6
[dn] => uid=672100001,c=cn,ou=company,o=depart
)
)
では、LDAPサーバへのアクセスは、クエリー・データベースのレコードと似ていることがわかります.実際,LDAPサーバも実際のアプリケーションではデータベースサーバと同様の役割を果たしている.上記の使い方のほかldap_search関数はワイルドカードの使用もサポートします.たとえば、LDAPサーバクエリの前のコードを次のように変更します.
<?php
$filter_val = "*@163.com";//        
$result= ldap_search($ldap_conn, $base_dn, "($filter_col=$filter_val)");//    
?>
ここでは、"@163.com"で終わるメールアドレスを含むすべてのレコードが返されます.
クエリー結果の値の取得
上記の例では、LDAPサーバのクエリ結果の情報が完全に取得され、配列内の値に基づいて他の操作が可能になります.また、PHPは、クエリ結果の値を取得するための特別な方法を提供しています.まずldap_とget_entriesの似たような関数--ldap_first_entryでは、関数は結果オブジェクトの最初のレコードのみを取得し、構文フォーマットは次のとおりです.
ldap_first_entry(ldap_conn, result)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトであり、resultは、前にLDAPディレクトリをクエリーしたときに返されるオブジェクトです.結果の値を取得する関数はldap_です.get_values、この関数の構文フォーマットは以下の通りです.
ldap_get_values(ldap_conn, entry, column)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトであり、entryは前にクエリー結果をクエリーしたときに返されたオブジェクトであり、columnは返される値が存在する列の名前である.この関数は、カラム情報のみを含む配列を返します.次のコードは、前の配列のgivenname列を返します.
<?php
$ldap_host = "ldap://192.168.3.1"; //LDAP      
$ldap_port = "389"; //LDAP       
$ldap_user = ""; //        
$ldap_pwd = ""; //       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server");//    LDAP       
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server.");//      
$base_dn = "ou=company,o=depart";//          
$filter_col = "mail";//        
$filter_val = "[email protected]";//        
$result= ldap_search($ldap_conn, $base_dn, "($filter_col=$filter_val)");//    
$entry = ldap_first_entry($ldap_conn, $result);//         
$firstname = ldap_get_values($ldap_conn, $entry, "givenname");//         
print_r($firstname);//  
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server.");//        
?>

運転結果は以下の通りです.
Array
(
[0] => Peng Cheng
[1] => Peng
[count] => 2
)

クエリー結果のレコード数の計算
クエリ結果のレコード数ldapの計算count_entries関数を実装します.この関数の構文フォーマットは以下のようになります.
ldap_count_entries(ldap_conn, result)
ldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクトです
、resultは、前にLDAPディレクトリをクエリーしたときに返されるオブジェクトです.次のコードは、クエリー結果のレコード数を計算します.
<?php
$ldap_host = "ldap://192.168.3.1";//LDAP      
$ldap_port = "389";//LDAP       
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server");//    LDAP       
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server.");//      
$base_dn = "ou=company,o=depart";//          
$filter_col = "mail";//        
$filter_val = "*@163.com";//        
$result = ldap_search($ldap_conn, $base_dn, "($filter_col=$filter_val)");//    
$count = ldap_count_entries($ldap_conn, $result);//           
echo "Total records count: ".$count;//           
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server.");//        
?>

ここではワイルドカードを使用してLDAPデータベースのクエリーを行うため、複数のレコードが返される可能性があります.
LDAPへの新規レコードの追加
LDAPに新しいレコードを追加ldap_を使用add関数で完了します.
ldap_add(ldap_conn, base_dn, entry)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクト、base_dnはLDAPサーバのクエリー・プライマリ・キーであり、entryは新しいレコードを格納する配列である.次のコードは、LDAPサーバに新しいレコードを追加する機能を実現します.
<?php
$ldap_host = "ldap://192.168.3.1";//LDAP      
$ldap_port = "389";//LDAP       
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server");//    LDAP       
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server."); //      

$base_dn = "ou=company,o=depart";  //          
$entry["givenname"] = "Simon";  //       
$entry["company"] = "PHP workshop";
$entry["mail"] = "[email protected]";
$entry["serial_no"] = "100001";
ldap_add($ldap_conn, $base_dn, $entry)  or die("Can't add new entry!");
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server."); //        
?>

LDAPのレコードを更新
LDAPのレコードを更新ldapを使用modify関数で完了
ldap_modify(ldap_conn, base_dn, entry)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクト、base_dnはLDAPサーバのクエリー・プライマリ・キーであり,entryは更新後のレコードを格納する配列である.以下のコードはLDAPレコードを更新する機能を実現している.
<?php
$ldap_host = "ldap://192.168.3.1";//LDAP      
$ldap_port = "389";//LDAP       
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server"); //    LDAP       
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server."); //      
$base_dn = "ou=company,o=depart"; //          
$entry = array("company" => "PHP Workshop", "mail" => "[email protected]");//          
ldap_modify($ldap_conn, $base_dn, $entry) or die("Can't modify entry."); //    
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server."); //        
?>

LDAPから新しいレコードを削除
LDAPのレコードを削除ldap_を使用delete関数で完了します.
ldap_modify(ldap_conn, base_dn)

ここでldap_connは、前にLDAPサーバに接続したときに作成された接続オブジェクト、base_dnはLDAPサーバのクエリー・プライマリ・キーです.以下のコードはLDAPレコードを削除する機能を実現している.
<?php
$ldap_host = "ldap://192.168.3.1";//LDAP      
$ldap_port = "389";//LDAP       
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server"); //    LDAP       
ldap_bind($ldap_conn, $ldap_user, $ldap_pwd) or die("Can't bind to LDAP server.");//      
$base_dn = "ou=company,o=depart"; //          
ldap_delete($ldap_conn, $base_dn) or die("Can't delete entry."); //    
ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server."); //        
?>

エラー処理
PHPはLDAP操作に対するエラー処理の方法も提供する.主にldap_の3つの関数が含まれていますerrno、ldap_Errorとldap_err2str.ldap_errnoの構文フォーマットは以下の通りです.int ldap_Errno(resource)では、resourceはLDAP操作で生成されたオブジェクトであり、この関数はエラーコードを返します.ldap_errorの構文フォーマットは以下の通りです.
string ldap_error(resource)

ここでresourceはLDAP操作で生成されたオブジェクトであり、この関数はエラー情報を返します.ldap_Err 2 strの構文フォーマットは以下の通りです.
string ldap_error(int errno)

ここでerrnoは、エラー情報を返す前に返されるエラーコードです.この関数は、主にエラーコードをエラー情報出力に変換するために使用されます.次のコードは、存在しないサーバに接続し、エラーのコードとエラー情報を出力しようとします.
<!--?php <br ?--> $ldap_host = "ldap://192.168.3.44";//LDAP      
$ldap_port = "389";//LDAP       
$ldap_user = "";//        
$ldap_pwd = "";//       
$ldap_conn = ldap_connect($ldap_host, $ldap_port);//    LDAP       
@ldap_bind($ldap_conn, $ldap_user, $ldap_pwd);//      
echo "Error number: ".ldap_errno($ldap_conn)."
";//      
echo "Error message: ".ldap_error($ldap_conn)."
";//      
echo ldap_err2str(ldap_errno($ldap_conn));//      
?>

運転コードは以下の通りです.
Error number: 81
Error message: Can’t contact LDAP server
Can’t contact LDAP server
上のコードはまずエラーコードを出力し、それからエラー情報を出力し、最後にldap_を使用します.Err 2 str関数は、エラーコードをエラー情報に変換します.2つの方法で出力されるエラー情報は完全に同じであることがわかる.
LDAPを使用したユーザー認証
実際のアプリケーションでは、複数のアプリケーションが共通のユーザー名とパスワードを使用してログインする必要がある場合があります.たとえば、企業は複数のシステムを使用して従業員の日常的な操作を処理し、すべてのシステムは同じLDAPディレクトリからのユーザー情報を使用して認証されます.これにより、システムごとに異なるパスワードを保存する必要がなくなり、LDAPディレクトリにパスワードを1つ保存するだけで済みます.LDAPを使用してユーザーIDを検証する原理は、前節で説明したLDAPサーバをバインドする方法と同じです.異なる認証時のユーザー名とパスワードは、ユーザーの入力から取得されます.完全なコードは次のとおりです.
<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
Header("WWW-Authenticate: Basic realm=\"login\"");
Header("HTTP/1.0 401 Unauthorized");
}
else
{
$ldap_host = "ldap://192.168.3.1";
$ldap_port = "389";
$ldap_user = $_SERVER['PHP_AUTH_USER'];
$ldap_pwd = $_SERVER['PHP_AUTH_PW'];
$ldap_conn = ldap_connect($ldap_host, $ldap_port)
or die("Can't connect to LDAP server");
@ldap_bind($ldap_conn, $ldap_user, $ldap_pwd);if(ldap_errno($ldap_conn)!=0)
{
echo "Can't log in! ".ldap_error($ldap_conn)."<br>";
}
else
{
echo "Welcome $ldap_user";
}
}
?>

注意が必要なのは、ここで$_を使用していることです.SERVER['PHP_AUTH_USER']および$SERVER['PHP_AUTH_PW']は、ユーザ名とパスワードを取得する.