天天看點

LDAP介紹(二)

LDAP是什麼 

LDAP是一個用來釋出目錄資訊到許多不同資源的協定。通常它都作為一個集中的位址本使用,不過根據組織者的需要,它可以做得更加強大。 

  LDAP最基本的形式是一個連接配接資料庫的标準方式。該資料庫為讀查詢作了優化。是以它可以很快地得到查詢結果,不過在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作為一個hierarchal資料庫使用,而不是一個關系資料庫。是以,它的結構用樹來表示比用表格好。正因為這樣,就不能用SQL語句了。 

  簡單說來,LDAP是一個得到關于人或者資源的集中、靜态資料的快速方式。 

LDAP是輕量目錄通路協定(Lightweight Directory Access Protocol)的縮寫,其實是一話号碼簿,類似于我們所使用諸如NIS(Network Information Service)、DNS (Domain Name Service)等網絡目錄,也類似于你在花園中所看到的樹木。

LDAP是一種特殊的資料庫。但是LDAP和一般的資料庫不同,明白這一點是很重要的。 LDAP對查詢進行了優化,與寫性能相比LDAP的讀性能要優秀很多。 

1.1 LDAP的存儲規則 

區分名(DN,Distinguished Name) 

和自然界中的樹不同,檔案系統/LDAP/電話号碼簿目錄的每一片枝葉都至少有一個獨一無二的屬性,這一屬性可以幫助我們來差別這些枝葉。 

在檔案系統中, 這些獨一無二的屬性就是帶有完整路徑的檔案名。比如/etc/passwd,該檔案名在該路徑下是獨一無二的。當然我們可以有/usr/passwd, /opt/passwd,但是根據它們的完整路徑,它們仍然是唯一的。 

在LDAP中,一個條目的區分名稱叫做“dn”或者叫做區分名。在一個目錄中這個名稱總是唯一的。比如,我的dn是"uid=aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我們可以有諸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。這同上面檔案系統中/etc/passwd 和 /usr/passwd的例子很類似。 

我們有獨一無二的屬性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。這并不沖突。 

CN=Common Name 為使用者名或伺服器名,最長可以到80個字元,可以為中文; 

OU=Organization Unit為組織單元,最多可以有四級,每級最長32個字元,可以為中文; 

O=Organization 為組織名,可以3—64個字元長 

C=Country為國家名,可選,為2個字元長 

LDAP目錄以一系列“屬性對”的形式來存儲記錄項,每一個記錄項包括屬性類型和屬性值(這與關系型資料庫用行和列來存取資料有根本的不同)。 

mail = [email][email protected][/email] 

othermailbox = [email][email protected][/email] 

givenname = givenname 

sn = test sn 

屬性可添加,以下一個屬性必須指派: 

objectclass=person (值為:person 或 server 或 organization 或 其他自定義的值) 

2 Php如何操作LDAP 

2.1 Php如何與LDAP連接配接和關閉 

$ds=ldap_connect("ServerName") 

ServerName是LDAP的伺服器名, 

例: 

$ds=ldap_connect(“10.31.172.30:1000”) 

傳回值是:true 或 false 

關閉連接配接 

ldap_close($ds); 

2.2 在php中如何搜尋使用者資訊 

$ds=ldap_connect("10.31.172.30:1000"); 

//首先連接配接上伺服器 

$justthese = array("cn","userpassword",”location”); 

//搜尋函數中的一個參數,要求傳回哪些資訊, 

//以上傳回cn,userpassword,location,這些都要求小寫 

$sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese); 

//第一個參數開啟LDAP的代号 

//第二個參數最基本的 dn 條件值 , 例:”o=jite,c=cn” 

//第三個參數 filter 為布林條件,它的文法可以在 Netscape 站上找一份 dirsdkpg.pdf 檔案. 

// ’o’為組織名,’cn’ 為使用者名,使用者名可用通配符 ’*’ 

echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 個<p>"; 

//ldap_count_entries($ds,$sr)傳回記錄總數 

$info = ldap_get_entries($ds, $sr); 

//LDAP的全部傳回資料 

echo "資料傳回 ".$info["count"]."筆:<p>"; 

for ($i=0; $i<$info["count"]; $i++) { 

echo "dn為:". $info[$i]["dn"] ."<br>"; 

echo "cn為:". $info[$i]["cn"][0] ."<br>"; //顯示使用者名 

echo "email為:". $info[$i]["mail"][0] ."<p>"; //顯示mail 

echo "email為:". $info[$i][“userpassword"][0] ."<p>"; //顯示加密後的密碼 

2.3 添加使用者 

$r=ldap_bind($ds,"cn=domadmin,o=jite","password"); 

//系住一個管理者,有寫的權限 

// cn=domadmin,o=jite順序不能變 

$info["cn"]="aaa"; //必填 

$info["userpassword"]="aaa"; 

$info["location"]="shanghai"; 

$info["objectclass"] = "person"; //必填person為個人,還有server… 

ldap_add($ds, "cn=".$info["cn"].",o=jite", $info); 

ldap_unbind($ds); 

//取消綁定 

//關閉連接配接 

2.4 删除使用者 

ldap_bind($ds,"cn=domadmin,o=jite","password"); 

//綁定管理者,有删除的權限 

$dn="cn=dingxf,o=jite"; 

ldap_delete($ds, $dn); 

//删除使用者 

2.5 修改使用者資料 

//綁定管理者,有修改的權限 

//使用者dn 

$info["userpassword"]="aaa"; //要修改的資訊,放在數組變量中 

$info["location"]="shanghaisdaf"; 

ldap_modify($ds, $dn , $info); 

//修改函數 

2.6 使用者登入驗證 

if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){ 

echo "驗證通過"; 

}else{ 

echo "驗證不通過"; 

//關閉連接配接

本文轉自xudayu 51CTO部落格,原文連結:http://blog.51cto.com/xudayu/65172,如需轉載請自行聯系原作者