ldap php(使用PHP连接LDAP服务器)

摘要: 大家好,小太来为大家解答以上问题。ldapphp,使用PHP连接LDAP服务器这个很多人还不知道,现在让我们一起来看看吧!LDAP是一种用于向许多不同资源发布目录信息的协议。它通...

大家好,小太来为大家解答以上问题。ldapphp,使用PHP连接LDAP服务器这个很多人还不知道,现在让我们一起来看看吧!

LDAP是一种用于向许多不同资源发布目录信息的协议。它通常用作集中的地址簿。LDAP最基本的形式是连接数据库的标准方式。该数据库针对读取查询进行了优化。所以它能很快得到查询结果,但是在其他方面,比如更新,就慢了很多。值得注意的是,LDAP通常被用作层次数据库,而不是关系数据库。因此,它的结构用树来表示比用表来表示更好。正因为如此,你不能使用SQL语句。简而言之,LDAP是一种快速获取有关人员或资源的集中式静态数据的方法。下面做几件事:设置公共LDAP服务器的信息;创建LDAP查询;连接到LDAP服务器;如果连接成功,则处理该查询;打印格式;关闭连接;设计搜索界面的HTML表格并显示结果。设置公共LDAP服务器的信息:我们首先要做的是定义所有要搜索的LDAP服务器的信息:'LDAP_NAME'=新LDAP项目的名称'LDAP_SERVER'=新LDAP项目的IP地址或主机名'LDAP_ROOT_DN'=新LDAP项目的根的可分辨名称XMP?PHP$LDAP_NAME[0]='NetscapeNetCenter';$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]=“”;//如果(!$SERVER_ID)$SERVER_ID=0;建立LDAP查询:如前所述,LDAP查询不同于SQL查询。因此,声明受到某些限制。这里有一个基本的例子。//createquery$LDAP_query='cn=$common';在我们的例子中,“cn”是我们想要搜索的属性,而$common是从搜索到的表单中获得的字符串变量。LDAP的查询语句可以使用通配符'*'。比如,$Stanley会找到'danstanley'。连接到LDAP服务器:下面的函数连接到一个LDAP资源,并将连接的标识号赋给一个变量,就像连接到一个公共数据库,比如MySQL。Php//连接LDAP$Connect_id=LDAP_Connect($LDAP_server[$server_id]);在我们的示例中,“$connect_id”是连接的标识号,$ldap_SERVER是可能的ldap服务器的数组,$SERVER_ID是通过搜索表获得的LDAP服务器变量。如果连接成功,处理查询:如果连接成功,我们将获得一个有效的LDAP连接标识号,以便我们可以处理查询。PHP($connect_id){//authentication$bind_id=LDAP_bind($connect_id);//执行搜索$search_id=LDAP_search($connect_id,$LDAP_root_dn[$server_id],$LDAP_query);//将结果集赋给一个数组$result_array=LDAP_get_entries($connect_id,$search_id);}else{//Showconnectionerrorecho'couldnotconnecttoldapserver:$LDAP_server[$server_id]';}?一旦我们与LDAP服务器建立了连接,我们就必须进行身份验证。当PHP连接到大多数数据库时,它会发送用户名和密码。然而,在LDAP中,在执行绑定操作之前,身份验证是未知的。在我们的例子中,“$bind_id”是绑定连接的标识符。我们被匿名绑定到一个公共LDAP服务器。所以在执行ldap_bind()时,只需要连接标识号,不需要其他参数。认证之后,我们可以使用ldap_search()函数来执行查询,生成的$search_id是我们搜索的连接标识符。然后,我们使用ldap_get_entries()函数将结果集分配给$result_array变量。通过这种方式,我们可以按照逻辑的方式排列信息以进行显示。打印格式:执行LDAP搜索后,返回的数据按搜索顺序排列。但是我们在排序的时候没有SQL那么方便。我们可以只使用ORDERBY语句。通常,大多数公共LDAP目录没有标准的大小规范。排序基于字符的ASCII值。我们必须将所有字符格式化为小写,这样我们就可以按字母顺序输出它们。

LDAP结果集是一个多维数组,脚本中$result_array的结构如下:$result_array[0]['cn'][0]='DannieStanley'['dn'][0]='uid=Dannie,DC=spinweb.net'['givenname'][0]='Dannie'['sn'][0]='Stanley'['mail'][0]='danSPAM@spinweb.net'$result_array[1]['cn'][0比如我的名字是'dannie',我还可以在LDAP中添加一些属性,比如:$result_array[0]['cn'][0]='dannieStanley'['dn'][0]='uid=dannie,DC=spinweb.net'['givenname'][0]='dannie'['givenname'][0]='Dan'['sn'][0]='Stanley'['mail'][0]='dansPAM@spinweb.net'下面是Php//如果搜索成功,对结果进行排序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]=strtolow($result_array[$I]['sn'][0]);$format_array[$I][4]=strtolow($result_array[$I]['mail'][0]);}//排序数组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。='ahref='/'LDAP://$LDAP_SERVER[$SERVER_ID]/$dn/''$cn/A';$result_list。='Ahref='/'mailto:$email/''$email/A\n';===else{echo'resultsetemptyforquery:$LDAP_query';}?$format_array是我们构建的一个新数组,它包含查询的结果并被格式化用于输出。首先循环$result_array中的每个元素,并将其赋给一个二维数组进行排序。同时,我们使用strtolower()函数将所有值改为小写。我们使用PHP自带的sort()函数进行排序。第一个参数是要排序的数组,另一个是要执行的排序类型,这是由PHP文档定义的。既然是按字符串排序,就用“SORT_STRING”。我们循环格式化的数组,并把它赋给一个名为$result_list的输出字符,它包含HTML描述。需要注意的是,我在超链接中使用ldap的URL格式。这种格式的一个例子是类似的:href='LDAP://LDAP.domain.net/uid=dannie,dc=domain.net'。关闭连接:现在我们所有的数据都已经包含在$result_list中,我们可以安全地关闭LDAP的连接了。Php//关闭连接LDAP_Close($connect_id);自定义搜索界面的HTML表单:最后,我们需要自定义搜索的HTML表单,用于为用户执行搜索。Php//自定义窗体echo'centerforaction='\'$PHP_self\''method='\'get\';echo'searchin:selectname='\'SERVER_ID\''';//循环来为(I=0)建立SELECT选项;$iCOUNT($LDAP_NAME);br$I=echo'optionselectedvalue='\'$I\'''。$LDAP_NAME[$i]。/OPTION';echo'/SELECT';echo'searchfor:inputname='\'common\''type='\'text\''';echo'inputname='\'lookup\'type='\'submit\'value='\'go\';echo'(youcanuse*forwildcardsearches,ex。*Stanleywillfindallstanleys)’;回声'/形式/中心';代码中的$PHP_SELF是一个全局常量,它代表脚本页面本身,其中的循环用于通过我们的$LDAP_NAME变量创建SELECT选项。显示:现在所有的工作都完成了,我们将打印出结果集。如果没有匹配的结果,将显示消息“NoResults”。

?php//显示结果if($result_list){echo'CENTERTABLEborder='\'1\'\'cellpadding='\'10\'cellspacing='\'0\'#FFFFEA\'WIDTH=\'450\'TBODYTRTD$result_list/TD/TR/TBODY/TABLE/CENTER';}否则回显“没有结果”;源代码以下是完整的源代码,只要将它剪切并粘贴到一个超文本标记语言文档,就可以尝试一下了。PHP$LDAP_NAME[0]='NetscapeNetCenter';$LDAP_SERVER[0]='成员目录。网景公司。com’;$LDAP_ROOT_DN[0]='ou=member_directory,o=netcenter。com’;$LDAP_NAME[1]='Bigfoot';$LDAP_SERVER[1]='LDAP。大脚野人。com’;$LDAP_ROOT_DN[1]="";//如果没有选择服务器的话将它设置为0if(!$SERVER_ID)$SERVER_ID=0;//建立查询$ldap_query='cn=$common//连接到LDAP$connect_ID=LDAP_connect($LDAP_SERVER[$SERVER_ID]);if($connect_id){//认证$bind_id=LDAP_bind($connect_id);

//执行搜索$search_ID=LDAP_search($connect_ID,$LDAP_ROOT_DN[$SERVER_ID],$LDAP_query);//将结果***分配给一个数组$result_array=LDAP_get_entries($connect_id,$search_id);}else{//显示连接错误回声”无法连接到轻量级目录访问协议服务器:$LDAP_SERVER[$SERVER_ID]";}//如果搜索成功,将结果排序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]['给定名称'][0]);$format_array[$I][3]=strtow($result_array[$I]['sn'][0]);$format_array[$I][4]=strtow($result_array[$I]['mail'][0]);}//排序数组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.='ahref='/'LDAP://$LDAP_SERVER[$SERVER_ID]/$dn/''$fname$lname/A';$result_list.='$email\使用if($dn$cn$email){$result_list.='ahref='/'LDAP://$LDAP_SERVER[$SERVER_ID]/$dn/''$cn/A';$result_list.='Ahref='/'mailto:$email/''$email/A\n';else{echo'resultsetemptyforquery:$LDAP_query';}//关闭连接LDAP_close($connect_id);//定制表格echo'centerformaction='\'$PHP_SELF\''method='\'GET\';“回显”搜索范围:selectname='\'SERVER_ID\//循环以建立挑选选项for($I=0;$Iecho'optionselectedvalue='\'$I\'.$LDAP_NAME[$i].“/OPTION”;echo'/SELECT';“回显”搜索:输入名称='\'common\''type='\'text\echo'inputname='\'lookup'type='\'submit'value='\'go\';echo'(可以使用*进行通配符搜索,例如.*StanleywillfindallStanleys)’;回声'/形式/中心;//显示结果if($result_list){echo'CENTERTABLEborder='\'1\'\'cellpadding='\'10\'cellspacing='\'0\'#FFFFEA\'WIDTH=\'450\'TBODYTRTD$result_list/TD/TR/TBODY/TABLE/CENTER';其他回显“没有结果”;

本文到此结束,希望对大家有所帮助。