国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 基礎(chǔ)常識 > 正文

PHP如何連接LDAP服務(wù)器

2020-02-28 16:41:19
字體:
供稿:網(wǎng)友

LDAP是用來發(fā)布目錄信息到不同資源的協(xié)議,通常都是作為集中的地址本使用,但是你知道PHP如何連接LDAP服務(wù)器嗎?相信這是很多人都不了解的,現(xiàn)在我們就去看看。

LDAP是一個用來發(fā)布目錄信息到許多不同資源的協(xié)議。通常它都作為一個集中的地址本使用。LDAP最基本的形式是一個連接數(shù)據(jù)庫的標(biāo)準(zhǔn)方式。該數(shù)據(jù)庫為讀查詢作了優(yōu)化。因此它可以很快地得到查詢結(jié)果,不過在其它方面,例如更新,就慢得多。要特別注意的是,LDAP通常作為一個hierarchal數(shù)據(jù)庫使用,而不是一個關(guān)系數(shù)據(jù)庫。因此,它的結(jié)構(gòu)用樹來表示比用表格好。正因?yàn)檫@樣,就不能用SQL語句了。

  簡單說來,LDAP是一個得到關(guān)于人或者資源的集中、靜態(tài)數(shù)據(jù)的快速方式。

  我們來做這樣幾件事:

  設(shè)置公共LDAP服務(wù)器的信息;創(chuàng)建一個LDAP查詢;連接到LDAP服務(wù)器;如果連接成功,處理查詢;格式化輸出;關(guān)閉連接;設(shè)計(jì)搜索界面的HTML表格并顯示結(jié)果。

  設(shè)置公共LDAP服務(wù)器的信息:

  我們要做的第一件事情是定義所有欲搜索的LDAP服務(wù)器的信息:
"LDAP_NAME"?=?新的LDAP項(xiàng)目的名字
"LDAP_SERVER"?=?新的LDAP項(xiàng)目的IP地址或者主機(jī)名
"LDAP_ROOT_DN"?=?新的LDAP項(xiàng)目的根的辨識名

<?php?

$LDAP_NAME[0]?=?"Netscape?Net?Center";?
$LDAP_SERVER[0]?=?"memberdir.netscape.com";?
$LDAP_ROOT_DN[0]?=?"ou=member_directory,o=netcenter.com";?

$LDAP_NAME[1]?=?"Bigfoot";?
$LDAP_SERVER[1]?=?"ldap.bigfoot.com";?
$LDAP_ROOT_DN[1]?=?"";?


//如果沒有選擇服務(wù)器的話將它設(shè)置為0?
if(!$SERVER_ID)?
$SERVER_ID=0;?

?>?
建立LDAP查詢:

前面已經(jīng)提到,LDAP查詢與SQL查詢是不一樣的。因此,語句要受到一定的限制,以下是一個基本的例子。

//Create?Query?$ldap_query?=?"cn=$common";?
  在我們的例子中,“cn”是我們要進(jìn)行搜索的屬性,而$common是由搜索的form中得到的字符串變量。LDAP的查詢語句語句可使用通配符‘*’。例如‘$stanley’將可以找出‘dan?stanley’。
連接到LDAP服務(wù)器:

  以下的函數(shù)連接到一個LDAP資源,并且將連接的識別號賦給一個變量,就好象連接到一個通常的數(shù)據(jù)庫一樣,例如MySQL。

<?php?

//連接到LDAP?
$connect_id?=?ldap_connect($LDAP_SERVER[$SERVER_ID]);?

?>?

  在我們的例子中,“$connect_id”是連接的識別號,$LDAP_SERVER是可能的ldap服務(wù)器數(shù)
組,而$SERVER_ID是由搜索表格得到的LDAP服務(wù)器變量。

  如果連接成功,處理查詢:
  如果連接成功的話,我們將得到一個有效的LDAP連接識別號,這樣我們就可以處理查詢。

<?php?

if($connect_id)?
{?
//認(rèn)證
$bind_id?=?ldap_bind($connect_id);?

//執(zhí)行搜索?
$search_id?=?ldap_search($connect_id,?$LDAP_ROOT_DN[$SERVER_ID],?$ldap_query);?

//將結(jié)果集合分配給一個數(shù)組?
$result_array?=?ldap_get_entries($connect_id,?$search_id);?
}?
else?
{?
//顯示連接錯誤?
echo?"Could?not?connect?to?LDAP?server:?$LDAP_SERVER[$SERVER_ID]";?
}?

?>?
  一旦我們與LDAP服務(wù)器建立好連接,我們就必須進(jìn)行認(rèn)證。PHP在連接大多數(shù)的數(shù)據(jù)庫時,都是通過發(fā)送用戶名和密碼來進(jìn)行的。不過,在LDAP中,認(rèn)證是未知的,直到進(jìn)行一個bind操作。在我們的例子中,“$bind_id”是綁定連接的標(biāo)識符。我們是通過匿名綁定到公共的LDAP服務(wù)器的。因此,在執(zhí)行l(wèi)dap_bind()時,只使用連接識別號就可以了,無需其它的參數(shù)。

  在經(jīng)過認(rèn)證后,我們就可以使用ldap_search()函數(shù)來執(zhí)行查詢,產(chǎn)生的$search_id是我們搜索的連接識別符。然后,我們使用ldap_get_entries()函數(shù)將結(jié)果集賦給$result_array變量。這樣我們能夠以邏輯的方式排列信息,以便顯示。?格式化輸出:

  在執(zhí)行完LDAP搜索后,返回的數(shù)據(jù)是以查找的順序排列的。不過我們在排序時沒有SQL這樣方便,使用ORDER?BY語句就可以了。通常多數(shù)公共的LDAP目錄都沒有標(biāo)準(zhǔn)的大小規(guī)范。排序是基于字符的ASCII值,我們必須將字符全部格式化為小寫,以便按字母的順序輸出。
LDAP結(jié)果集是一個多維的數(shù)組,腳本中的$result_array的結(jié)構(gòu)如下:

$result_array[0]["cn"]?[0]?=?"Dannie?Stanley"
["dn"]?[0]?=?"uid=dannie,dc=spinweb.net"
["givenname"][0]?=?"Dannie"
["sn"]?[0]?=?"Stanley"
["mail"]?[0]?=?"danSPAM@spinweb.net"
$result_array[1]["cn"]?[0]?=?"Michael?Reynolds"
["dn"]?[0]?=?"uid=michael,dc=spinweb.net"
["givenname"][0]?=?"Michael"
["sn"]?[0]?=?"Reynolds"
["mail"]?[0]?=?"michaelSPAM@spinweb.net"?

  數(shù)據(jù)以這種格式存放的原因是每個屬性都可能有超過一個值(象樹的結(jié)構(gòu))。例如,如果我的名字是‘Dannie’,我
還可以在LDAP中增加一些屬性,例如:

$result_array[0]["cn"]?[0]?=?"Dannie?Stanley"
["dn"]?[0]?=?"uid=dannie,dc=spinweb.net"
["givenname"][0]?=?"Dannie"
["givenname"][0]?=?"Dan"
["sn"]?[0]?=?"Stanley"
["mail"]?[0]?=?"danSPAM@spinweb.net"

  在我們的搜索中,我們只關(guān)心每個屬性的首個值,因此除了dn只有一個值外,其它我們只使用每個屬性中序號為0的
值。以下就是屬性和它們含義的簡單列表:

"cn"?=?Common?Name
"dn"?=?Distinguished?Name
"givenname"?=?First?Name
"sn"?=?Last?Name
"mail"?=?Email地址

<?php?

//如果搜索成功,將結(jié)果排序?
if($result_array)?
{?
for($i=0;?$i?{?
$format_array[$i][0]?=?strtolower($result_array[$i]["cn"][0]);?
$format_array[$i][1]?=?$result_array[$i]["dn"];?
$format_array[$i][2]?=?strtolower($result_array[$i]["givenname"][0]);?
$format_array[$i][3]?=?strtolower($result_array[$i]["sn"][0]);?
$format_array[$i][4]?=?strtolower($result_array[$i]["mail"][0]);?
}?

//排序數(shù)組?
sort($format_array,?"SORT_STRING");?

for($i=0;?$i?{?
$cn?=?$format_array[$i][0];?
$dn?=?$format_array[$i][1];?
$fname?=?ucwords($format_array[$i][2]);?
$lname?=?ucwords($format_array[$i][3]);?
$email?=?$format_array[$i][4];?

if($dn?&&?$fname?&&?$lname?&&?$email)?
{?
$result_list?.=?"$fname?$lname";?
$result_list?.=?"?<$email〉
/n";?
}?
elseif($dn?&&?$cn?&&?$email)?
{?
$result_list?.=?"<A?href='/"ldap://$LDAP_SERVER[$SERVER_ID]/$dn/"'>$cn</A>";?
$result_list?.=?"?<A?href='/"mailto:$email/"'>$email</A>
/n";?
=?
=?
=?
else?
{?
echo?"Result?set?empty?for?query:?$ldap_query";?
}?

?>?
  $format_array是我們建立的新數(shù)組,里面包括有查詢的結(jié)果,并且被格式化用作輸出。首先循環(huán)$result_array中的每個元素,并且將它分配給一個兩維的數(shù)組用作排序。同時我們使用strtolower()函數(shù)將所有的值變?yōu)樾憽?/p>

我們使用PHP自帶的一個稱為sort()的函數(shù)進(jìn)行排序。首個參數(shù)是要排序的數(shù)組,另一個是要執(zhí)行的排序類型,該類型是由PHP的文檔定義的。由于我們根據(jù)字符串排序,我們使用“SORT_STRING”。

我們循環(huán)已經(jīng)格式化好的數(shù)組,并且將它分配給一個名字為$result_list的輸出字符,該字符包含了HTML描述。要特別注意的是,在超鏈接中,我使用的是ldap的URL格式。這個格式的例子類似:HREF="ldap://ldap.domain.net/uid=dannie,dc=domain.net"。?

關(guān)閉連接:

現(xiàn)在我們所有的數(shù)據(jù)已經(jīng)包含在$result_list中了,我們可以安全地關(guān)閉LDAP的連接。
<?php?

//關(guān)閉連接
ldap_close($connect_id);?

?〉

定制搜索界面的HTML表格:
最后,我們要定制搜索用的HTML表格,它是用來給用戶執(zhí)行搜索的。

<?php?
//定制表格
echo?"?<CENTER><FORM?action='/"$PHP_SELF/"'?method='/"GET/"'>";?
echo?"Search?in:<SELECT?name='/"SERVER_ID/"'>";?//循環(huán)以建立SELECT選項(xiàng)?for($i=0;?$i<COUNT($LDAP_NAME);
?<br?$i++=>?echo?"<OPTION?selected?value='/"$i/"'>".$LDAP_NAME[$i]."</OPTION>";?echo?"</SELECT>
";?
echo?"Search?for:<INPUT?name='/"common/"'?type='/"text/"'>";?
echo?"<INPUT?name='/"lookup/"'?type='/"submit/"'?value='/"go/"'>
";?
echo?"(You?can?use?*?for?wildcard?searches,?ex.?*?Stanley?will?find?all?Stanleys)
";?
echo?"</FORM></CENTER>";?

?>?

  代碼中的$PHP_SELF是一個全局的常量,代表的是腳本頁面自身,其中的循環(huán)是用來通過我們的$LDAP_NAME變量創(chuàng)建
SELECT選項(xiàng)。

顯示結(jié)果:

現(xiàn)在所有的工作已經(jīng)完成了,我們將打印出結(jié)果集。如果沒有符合的結(jié)果,將會顯示"No?Results"的信息。

<?php?

//顯示結(jié)果
if($result_list)?
{?
echo?"?<CENTER><TABLE?border='/"1/"'?cellPadding='/"10/"'?cellSpacing='/"0/"'?
BGCOLOR=/"#FFFFEA/"?WIDTH=/"450/">?<TBODY><TR><TD>$result_list</TD></TR>
</TBODY></TABLE></CENTER>";?
}?
else?
echo?"No?Results";?


?>?

源代碼

  以下是完整的源代碼,只要將它剪切并粘貼到一個HTML文檔,就可以嘗試一下了。

<?php?

$LDAP_NAME[0]?=?"Netscape?Net?Center";?
$LDAP_SERVER[0]?=?"memberdir.netscape.com";?
$LDAP_ROOT_DN[0]?=?"ou=member_directory,o=netcenter.com";?

$LDAP_NAME[1]?=?"Bigfoot";?
$LDAP_SERVER[1]?=?"ldap.bigfoot.com";?
$LDAP_ROOT_DN[1]?=?"";?

//如果沒有選擇服務(wù)器的話將它設(shè)置為0?
if(!$SERVER_ID)?
$SERVER_ID=0;?

//建立查詢
$ldap_query?=?"cn=$common";?

//連接到LDAP?
$connect_id?=?ldap_connect($LDAP_SERVER[$SERVER_ID]);?

if($connect_id)?
{?
//認(rèn)證?
$bind_id?=?ldap_bind($connect_id);?

//執(zhí)行搜索?
$search_id?=?ldap_search($connect_id,?$LDAP_ROOT_DN[$SERVER_ID],?$ldap_query);?

//將結(jié)果集合分配給一個數(shù)組?
$result_array?=?ldap_get_entries($connect_id,?$search_id);?
}?
else?
{?
//顯示連接錯誤?
echo?"Could?no

看完上述內(nèi)容之后你知道PHP如何連接LDAP服務(wù)器了嗎?更多詳細(xì)內(nèi)容就請關(guān)注武林技術(shù)頻道。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 枞阳县| 同江市| 贵定县| 深圳市| 抚顺市| 洪洞县| 东丽区| 滁州市| 邵阳县| 宣武区| 黑龙江省| 玉山县| 隆子县| 泗水县| 八宿县| 油尖旺区| 合水县| 安义县| 蓬莱市| 克拉玛依市| 开平市| 泽州县| 盐津县| 巴里| 苍溪县| 中宁县| 手机| 堆龙德庆县| 云安县| 盐亭县| 黎平县| 镇坪县| 墨竹工卡县| 清丰县| 彭泽县| 三都| 奉贤区| 无极县| 黄浦区| 固始县| 嘉禾县|