本文将演示如何使用PHP连接一个LDAP服务器。具体的例子是连接到一个公共的LDAP服务器并且进行搜索。这个例子模拟的是Netscape Communicator 4.*,通过自己的地址本连接到LDAP资源。

LDAP介绍

可能不少人已经听说过LDAP,但是却不了解它具体是什么东东和如何工作。在这里我将不会很详细地介绍LDAP,只是对该协议做一个简介。

LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。

LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。

简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。

要求

PHPV.4(以前的版本也可以,不过没有经过测试),编译支持LADP,即使用编译时带--with-ldap公共的LDAP目录。在例子中提供了两个。

例子概览

1.设置公共LDAP服务器的信息

2.创建一个LDAP查询

3.连接到LDAP服务器

4.如果连接成功,处理查询

5.格式化输出

6.关闭连接

7.设计搜索界面的HTML表格

8.显示结果

设置公共LDAP服务器的信息

我们要做的第一件事情是定义所有欲搜索的LDAP服务器的信息

"LDAP_NAME" = 新的LDAP项目的名字

"LDAP_SERVER" = 新的LDAP项目的IP地址或者主机名

"LDAP_ROOT_DN" = 新的LDAP项目的根的辨识名

<?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] = "";

//如果没有选择服务器的话将它设置为0

if(!$SERVER_ID)

$SERVER_ID=0;

?>

建立LDAP查询  前面已经提到,LDAP查询与SQL查询是不一样的。因此,语句要受到一定的限制,以下是一个基本的例子。

//Create Query $ldap_query = "cn=$common";

在我们的例子中,“cn”是我们要进行搜索的属性,而$common是由搜索的form中得到的字符串变量。LDAP的查询语句语句可使用通配符‘*’。例如‘$stanley’将可以找出‘dan stanley’。

连接到LDAP服务器

以下的函数连接到一个LDAP资源,并且将连接的识别号赋给一个变量,就好象连接到一个通常的数据库一样,例如MySQL。

<?php

//连接到LDAP

$connect_id = ldap_connect($LDAP_SERVER[$SERVER_ID]);

?>

在我们的例子中,“$connect_id”是连接的识别号,$LDAP_SERVER是可能的ldap服务器数组,而$SERVER_ID是由搜索表格得到的LDAP服务器变量。

如果连接成功,处理查询

如果连接成功的话,我们将得到一个有效的LDAP连接识别号,这样我们就可以处理查询。

<?php

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

{

//显示连接错误

echo "Could not connect to LDAP server: $LDAP_SERVER[$SERVER_ID]";

}

?>

一旦我们与LDAP服务器建立好连接,我们就必须进行认证。PHP在连接大多数的数据库时,都是通过发送用户名和密码来进行的。不过,在LDAP中,认证是未知的,直到进行一个bind操作。在我们的例子中,“$bind_id”是绑定连接的标识符。我们是通过匿名绑定到公共的LDAP服务器的。因此,在执行ldap_bind()时,只使用连接识别号就可以了,无需其它的参数。

在经过认证后(这里是匿名的),我们就可以使用ldap_search()函数来执行查询,产生的$search_id是我们搜索的连接识别符。

然后,我们使用ldap_get_entries()函数将结果集赋给$result_array变量。这样我们能够以逻辑的方式排列信息,以便显示。

格式化输出  在执行完LDAP搜索后,返回的数据是以查找的顺序排列的。不过我们在排序时没有SQL这样方便,使用ORDER BY语句就可以了。通常多数公共的LDAP目录都没有标准的大小规范。排序是基于字符的ASCII值,我们必须将字符全部格式化为小写,以便按字母的顺序输出。

要特别注意的是,返回的LDAP结果集是一个多维的数组。因此,我们脚本中的$result_array的结构如下:

$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"

数据以这种格式存放的原因是每个属性都可能有超过一个值(象树的结构)。例如,如果我的名字是‘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"

在我们的搜索中,我们只关心每个属性的首个值,因此除了dn只有一个值外,其它我们只使用每个属性中序号为0的值。以下就是属性和它们含义的简单列表:

"cn" = Common Name

"dn" = Distinguished Name

"givenname" = First Name

"sn" = Last Name

"mail" = Email地址

<?php

//如果搜索成功,将结果排序

if($result_array)

{

for($i=0; $i

在我们的例子中,$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表格,它是用来给用户执行搜索的。

//定制表格

echo " <CENTER><FORM action='/"$PHP_SELF/"' method='/"GET/"'>";

echo "Search in:<SELECT name='/"SERVER_ID/"'>"; //循环以建立SELECT选项 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是一个全局的常量,代表的是脚本页面自身,其中的循环是用来通过我们的$LDAP_NAME变量创建SELECT选项。

显示结果

现在所有的工作已经完成了,我们将打印出结果集。如果没有符合的结果,将会显示"No Results"的信息。

//显示结果

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] = "";

//如果没有选择服务器的话将它设置为0

if(!$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

{

//显示连接错误

echo "Could not connect to LDAP server: $LDAP_SERVER[$SERVER_ID]";

}

//如果搜索成功,将结果排序

if($result_array)

{

for($i=0; $i

php 连接 ldap 实例,使用PHP连接LDAP服务器相关推荐

  1. java 连接多实例_Java如何连接多实例SQL Server?

    异常产生 Java连接SQL Server一般字符串:jdbc:sqlserver://127.0.0.1:1433;DatabaseName=数据库名; 大家应该知道:如果机器上安装的是SQLSer ...

  2. 云服务器 ECS快速入门:远程连接 ECS 实例

    远程连接 ECS 实例 阿里云在控制台为您提供了 管理终端,方便您远程连接并管理 ECS 实例. 您也可以使用其他方式远程连接 ECS 实例: 如果是 Linux 实例: 使用 SSH 密钥对连接 L ...

  3. java 连接池实例_功能完善的Java连接池调用实例

    /** * Title: ConnectPool.java * Description: 连接池管理器 * Copyright: Copyright © 2002/12/25 * Company: * ...

  4. java ladp用户认证_java – LDAP:如何使用连接详细信息验证用户身份

    我无法使用LDAP对用户进行身份验证.我有以下细节: URL=ldap://10.10.10.10:389 LDAP BASE:DC=lab2,DC=ins LDAP Bind Account: CN ...

  5. Appium 移动端自动化 - Android SDK的安装与配置,使用安卓SDK连接手机实例演示

    Android SDK 的安装与配置演示 第一章:Android SDK 的安装 ① 下载 ② 安装过程 ③ 配置 第二章:连接手机 USB 调试 ① 一加8手机连接演示 第一章:Android SD ...

  6. PHP 连接 Rabbitmq 实例代码(亲测通过)

    接下来我们用 php 连接 rabbitmq 玩一玩. 还没有安装 rabbitmq ,请参考 Rabbitmq 安装 还没有安装 PHP 的 AMQP 扩展,参考 PHP AMQP 扩展安装 一些概 ...

  7. 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭...

    在win7 中安装VS2008开发DNN的模块,经常出现"由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例.该连接将关闭"的问题,在网上找了下有如下解决 ...

  8. vb mysql_VB连接MYSQL实例

    VB连接MYSQL实例 电脑需安装数据库'mysql server'和'mysql connector net'相关版本软件. 在工程的'项目'-'添加引用'中添加引用'mysql.data' 实现代 ...

  9. 快速解决:阿里云ECS实例远程桌面连接 发生身份验证错误。要求的函数不受支持 !

    三步解决问题: 本地PC 远程桌面连接 阿里云ECS实例 失败 ? 报错: "发生身份验证错误.要求的函数不受支持" ? 一.问题截图描述: 二.3步解决问题: 1. 网页版 · ...

最新文章

  1. android广告轮播图之匀速规律播放
  2. 物理化学 化学 动力学(上)
  3. maven中出现 ‘dependencies.dependency.version‘ for xxxx:jar is missing
  4. 通知:前blog文章全丢了..
  5. CodeForces - 225C. Barcode(DP)
  6. 润乾报表分组求和_一招搞定各种报表合计需求
  7. i2c通信 msp430g2553_关于msp430G2553的I2C串行通信
  8. (转) Spring读书笔记-----Spring的Bean之配置依赖
  9. 窗体案例:注册 登陆 主界面 c# 1613533126
  10. 时间预定java,在预定的时间运行任务java,apache
  11. 《C++Primer》14、15章
  12. 矩阵中求最大二维矩阵
  13. 高中会考计算机网络技术试题,高中信息技术会考练习复习试题及答案
  14. Android快速转战Kotlin教程
  15. OFDM学习笔记(十)(MIMO-OFDM技术)
  16. 最新WIFI分销大师小程序源码+带后端/亲测可用
  17. 【python实现视频解帧并保存到文件夹】
  18. IDEA推出新字体,极度舒适
  19. 商汤绝影再下一城,赋能本田中国首款纯电系列新车发布
  20. 阿里云弹性计算产品总监王志坤:在分布式云领域的产品布局和最佳实践

热门文章

  1. Xilinx与Altera的FPGA区别
  2. [TJOI2017]DNA --- 后缀数组
  3. 使用FullCalendar做一个自己的日程管理(二)- 事件篇
  4. 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio separation Network)
  5. 用python实现12306抢票
  6. 未来可能发生的十大颠覆性科技创新
  7. TortoiseSVN上传文件显示被锁定
  8. linux从视频中提取音乐,Linux下从电影(avi)中提取声音
  9. 多角度探讨灵活可扩缩的云上游戏解决方案
  10. Linux下查看某一进程所占用内存的方法 -- from cnblogser 小得盈满