PHP Conference Japan 2024

ldap_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_connect连接到 LDAP 服务器

描述

ldap_connect(?string $uri = null): LDAP\Connection|false
警告

从 PHP 8.3.0 开始,以下签名已弃用。

ldap_connect(?string $host = null, int $port = 389): LDAP\Connection|false

创建一个 LDAP\Connection 连接并检查给定的 uri 是否合理。

注意: 此函数不会打开连接。它检查给定的参数是否合理,并且可以在需要时立即用于打开连接。

参数

uri

完整 LDAP URI,格式为 ldap://hostname:portldaps://hostname:port 用于 SSL 加密。

您还可以提供以空格分隔的多个 LDAP URI 作为单个字符串

请注意,hostname:port 不是受支持的 LDAP URI,因为缺少架构。

host

要连接到的主机名。

port

要连接到的端口。

返回值

当提供的 LDAP URI 看起来合理时,返回一个 LDAP\Connection 实例。这是对提供的参数的语法检查,但不会联系服务器!如果语法检查失败,则返回 falseldap_connect() 否则将返回 LDAP\Connection 实例,因为它实际上并没有连接,而只是初始化连接参数。实际连接发生在对 ldap_* 函数的下一次调用中,通常使用 ldap_bind()

如果未指定任何参数,则将返回已打开连接的 LDAP\Connection 实例。

变更日志

版本 描述
8.3.0 现在已弃用使用单独的 hostnameport 调用 ldap_connect()
8.1.0 现在返回 LDAP\Connection 实例;以前,返回的是 资源

示例

示例 #1 连接到 LDAP 服务器的示例。

<?php

// LDAP 变量
$ldapuri = "ldap://ldap.example.com:389"; // 您的 ldap-uri

// 连接到 LDAP
$ldapconn = ldap_connect($ldapuri)
or die(
"该 LDAP-URI 无法解析");

?>

示例 #2 安全连接到 LDAP 服务器的示例。

<?php

// 确保您的主机是正确的
// 您已向其颁发了安全证书
$ldaphost = "ldaps://ldap.example.com/";

// 连接到 LDAP
$ldapconn = ldap_connect($ldaphost)
or die(
"该 LDAP-URI 无法解析");

?>

参见

添加注释

用户贡献的注释 27 条注释

nemanja at prolux-universal dot com
10 年前
如果您不希望您的 PHP 程序在您的某个公司 DC 出现故障时等待 XXX 秒后才放弃,并且由于 ldap_connect() 没有超时机制来指定用户时间,以下是我提供的解决方法,它展示了极佳的实用结果。

===========================================================
function serviceping($host, $port=389, $timeout=1)
{
$op = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$op) return 0; //DC 不可用
else {
fclose($opanak); //显式关闭打开的套接字连接
return 1; //DC 正在运行,我们可以安全地使用 ldap_connect 连接
}
}

// ##### 静态 DC 列表,如果您的 DNS 轮循未设置
// $dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');

// ##### 动态 DC 列表,按轮循结果排序的反向 DNS 查找
$dclist = gethostbynamel('domain.name');

foreach ($dclist as $k => $dc) if (serviceping($dc) == true) break; else $dc = 0;
// 在此循环之后,要么将存在至少一个当前可用的 DC,要么 $dc 将返回布尔值 false,而下一行将停止程序进一步执行

if (!$dc) exit("当前没有可用的域控制器,请稍后再试!"); // 通知用户

// 现在,ldap_connect 肯定会成功连接到先前测试的 DC,并且不会发生超时
$ldapconn = ldap_connect($dc) or die("DC 不可用,请稍后再试。");
===========================================================

此外,使用此方法,您可以获得非常好的故障转移功能,例如,一家拥有数十个 DC 的公司分布在遥远的地方,这样,如果当前至少有一个 DC 处于活动状态,您的 PHP 程序将始终具有高可用性。
Andrew (a.whyte at cqu.edu.au)
21 年前
要能够通过 LDAP 连接器修改 Active Directory,必须通过 SSL 绑定到 LDAP 服务。否则,Active Directory 提供的连接大部分是只读的。如果没有 LDAPS,您无法添加对象或修改某些属性,例如,只能使用 LDAPS 连接到 Active Directory 来更改密码。

因此,对于希望安全地连接到 Active Directory 的用户,从使用 PHP+OpenLDAP+OpenSSL 的 Unix 主机上,我自己花了一些时间来实现这一点,并遇到了一些问题。希望这对像我一样找不到答案的其他人有所帮助。

确保使用 OpenSSL 支持编译 OpenLDAP,并使用 OpenLDAP 和 OpenSSL 编译 PHP。

这为 PHP 提供了它利用 ldaps:// 连接所需的东西。

配置 OpenSSL

从 Active Directory 中提取您的根 CA 证书,这可以通过使用证书服务来实现,证书服务是 Windows 2000 Server 的一个标准组件,但默认情况下可能未安装(通常的“添加/删除软件”方法在这里可以使用)。我以 Base64 格式而不是 DER 格式提取了它。

将提取的 CAcert 放入 openssl 的 certs 文件夹中(例如 /usr/local/ssl/certs)并设置哈希符号链接。这可以通过简单地运行以下命令轻松完成

/usr/local/ssl/bin/c_rehash

完成后,您可以通过运行以下命令测试它是否有效

/usr/local/ssl/bin/openssl verify -verbose -CApath /usr/local/ssl/certs /tmp/exported_cacert.pem

(应返回:OK)。

配置 OpenLDAP

将以下内容添加到您的 ldap.conf 文件中。
(位于 /usr/local/openldap/etc/openldap/ldap.conf)

#--begin--

# 指示客户端请求服务器的证书。
#
# 警告:这将使服务器容易受到中间人攻击
# 攻击,并且不应在生产系统或外部使用
# 测试场景!
#
# 如果您使用此设置,则不需要任何其他设置,因为
# 没有请求证书,因此不会进行验证


#
**对于合适的解决方案,请查看 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/**
LDAPTLS_REQCERT never

**定义 CA 证书位置**
TLS_CACERT /usr/local/ssl/certs/AD_CA_CERT.pem
TLS_CACERTDIR /usr/local/ssl/certs

**#--end--**

您还需要将这些相同的设置放置在 Apache Web 用户主目录中名为 .ldaprc 的文件中。

例如:

cp /usr/local/openldap/etc/openldap/ldap.conf ~www/.ldaprc

然后,您可以测试是否能够从 OpenLDAP 命令工具建立到 Active Directory 的 LDAPS 连接。

/usr/local/openldap/bin/ldapsearch -H "ldaps://adserver.ad.com"

这应该会返回一些扩展 LDIF 格式的输出,并指示没有匹配的对象,但这证明连接有效。

您连接到的服务器名称很重要。如果在 "ldaps://" URI 中指定的服务器名称与证书中服务器的名称不匹配,它将发出如下报错:

ldap_bind: Can't contact LDAP server (81)
附加信息:TLS: hostname does not match CN in peer certificate

一旦您正确地运行了 ldapsearch 工具,PHP 也应该能够正常工作。

但是,一个重要的注意事项是 Web 用户必须能够找到其 HOME 文件夹。您必须检查 Apache 是否提供了设置为 Web 用户主目录的 HOME 变量,以便 php 可以找到 .ldaprc 文件以及其中包含的设置。这在不同的 Unix 变体之间可能会有所不同,但如果您错过了它并且它给您带来了麻烦,这是一个非常简单且愚蠢的事情。只需在 Apache 的 httpd.conf 中使用 SetEnv 指令即可。

SetEnv HOME /usr/local/www

完成所有这些操作后,您现在可以编写一个简单的连接函数。

function connect_AD()
{
$ldap_server = "ldaps://adserver.ad.com" ;
$ldap_user = "CN=web service account,OU=Service Accounts,DC=ad,DC=com" ;
$ldap_pass = "password" ;

$ad = ldap_connect($ldap_server) ;
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3) ;
$bound = ldap_bind($ad, $ldap_user, $ldap_pass);

return $ad ;
}

或者,您可以避免使用 URI 样式的服务器字符串,并使用类似 ldap_connect("adserver.ad.com", 636) ; 的方法,它也可以与 Active Directory 服务器一起正常工作。

希望这对您有所帮助。
lee at lareck70 dot net
9 年前
在 Windows 上使用 LDAPS 而无需 "c:\openldap\sysconf\ldap.conf"
生成一个类似 ldap.conf 的文件,并将其命名为 "ldaprc"。
对于在命令行上运行的 PHP 脚本,请将文件放到脚本所在目录。
对于在 Web 服务器上运行的 PHP 脚本,请将文件放到 PHP 的主目录。
harrison at glsan dot com
9 年前
可以通过在 php 中设置环境变量来覆盖 ssl ca 文件。

我发现将 ca 证书(和中间 ca)保存到名为 ca.pem 的文件中,然后添加

putenv('LDAPTLS_CACERT=./ca.pem');

在 ldap_connect 之前对我有效。
代码示例
<?php
putenv
('LDAPTLS_CACERT=./ca.pem');
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$l = ldap_connect("ldaps://ldap/");
ldap_set_option($l, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($l, "cn=apache,dc=example", "xxxxxxx");
echo(
ldap_error($l)."\n");
$s = ldap_search($l, "dc=example", "uid=test");
echo(
ldap_count_entries($l, $s)."\n");
?>
在同一目录下的 ca.pem 文件中,我们有我们的 ca
-----BEGIN CERTIFICATE-----
<证书内容>
-----END CERTIFICATE-----
peter dot burden at gmail dot com
15 年前
主机名参数可以是空格分隔的主机名列表。这意味着如果主服务器不可用,LDAP 代码将与备份服务器通信。在代码超时尝试与主服务器通信时会有延迟,但事情仍然会正常工作。这在典型的 Microsoft Active Directory 设置(主要和备份域控制器)中特别有用。
<?php
$ldaphost
= "192.168.0.100 192.168.0.101";
$ldapconn = ldap_connect($ldaphost);
?>
mwilmes at avc dot edu
9 年前
我支持一个在 CentOS 7 上使用 PHP-FPM 的 LAMP 栈,它需要通过 SSL 连接到 Active Directory。我们有该域的根证书。我能够分五个步骤设置它。

1. 以 base64 格式获取域的根 SSL 证书。(必须是企业管理员 - 如果您不是,请与您的管理员联系。)
运行 mmc.exe
文件 -> 添加/删除管理单元
选择证书颁发机构,然后选择为您的域生成证书的服务器。
展开树,直到找到根证书的条目,然后右键单击 -> 属性。
单击“查看证书”按钮,“详细信息”选项卡,然后单击“复制到文件...”按钮。
使用向导将根证书导出到您的计算机。确保使用 Base-64 格式。

2. 将根证书复制到 Linux 服务器。您可以在记事本中打开证书并复制粘贴内容。

3. 将证书转换为 pem 格式。根据需要替换文件名。
openssl x509 -in <复制的证书文件> -out /etc/openldap/certs/<证书>.pem

4. 在 ldap.conf 中添加一行以使用新的根证书。
vi /etc/openldap/ldap.conf
TLS_CACERT /etc/openldap/certs/<证书>.pem

5. 重新启动 PHP 服务。
systemctl restart php-fpm.service
blizzards at libero dot it
20 年前
要完整解答有关如何使用端口 636 上的 SASL 连接到 LDAP ACTIVE DIRECTORY 2000/2003 服务器的问题,您可以参考以前的说明以及以下指令

A) 从 AD 创建 CA 证书;
B) 以 .pem (DER) 格式导出;
C) 安装 OPENSSL、CYRUS SASL、OPENLDAP、KERBEROS 5;
D) 将导出的 AD ca 证书复制到 Unix 系统上的 openssl 证书目录;
E) 使用 c_reash 命令刷新;
F) 为您的用户从 AD 获取 Kerberos 票证;
G) 使用 SSL 和 LDAP 支持编译 PHP;
H) 使用 ldapsearch -D <binddn> -W -H ldaps://ad.secure.com:636 -x 测试

如果一切正常,请创建您的 php 脚本。

注意:要将参数写入 AD,您需要每 10 小时或更短时间(AD 默认票证生命周期)更新一次票证;对于读取目的,您可以保留已过期的票证。
查询 Windows 2000/2003 AD 时,**必须**仅使用 SASL,而不是 TLS(不支持)。
nateshull at gmail dot com
4 年前
在 WISP 栈上实现 LDAPS - Win、IIS、SQL、PHP
PHP 7.0.19

在某些说明方面遇到了一些问题,我需要 LDAPS 才能进行即将进行的 Active Directory 更新,该更新将删除不安全的 LDAP 连接。

在 php.ini 中启用 ldap 和 openssl 模块。

还要确保扩展位于 ext 文件夹中。

验证模块是否已加载:phpinfo()

备注
如果在代码中设置了环境变量,则不需要 ldap 或 openssl 配置文件。此外,ca 路径不喜欢路径周围的双引号。

***代码示例

<?php
$ldapuser
= "domain\\user";
$ldappass = "密码";
$ldapserver = "ldaps://server.domain.com";

//选项为 require、never、allow
//require 最安全,其他选项可能会允许中间人攻击
putenv('LDAPTLS_REQCERT=require');

//告诉 ldap 根 ca 证书在哪里
//请注意,路径中的空格允许不转义或加引号。
//我没有测试权限,但我认为服务应该具有读取权限。
putenv('LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem');

//测试以确保能够读取证书且路径正确。
echo file_get_contents("LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem");

// 设置调试
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

// 连接到 ldap 服务器
$ldapconn = ldap_connect($ldapserver) or die ("无法连接");

// 绑定到 ldap 服务器
$ldapbind = false;
$ldapbind = ldap_bind($ldapconn, $ldapuser, $ldappass);

// 简单查看成功或失败
if ($ldapbind) {
print(
"\n 已登录! \n\n");
} else {
print(
"\n 登录失败 \n\n");
}
?>
Nixahnung
9 年前
我花了很长时间才建立到 MS AD 全局编录端口 3269 的 LDAPS 连接。

我的五分钱

ldap_connect("ldaps://example.com", 3269)
=> 连接到 636.... :(,仅限 DC

ldap_connect("ldaps://example.com:3269")
=> 连接到 3269.... :),如预期的那样 GC

希望能有所帮助...
avel at noc uoa gr
22 年前
请注意,主机名可以是空格分隔的 LDAP 主机名列表。这对于故障转移非常有用;如果第一个 ldap 主机宕机,ldap_connect 将请求第二个 LDAP 主机。当然,您_必须_在执行此操作之前拥有 LDAP 副本。:) 阅读 LDAP API 文档以获取更多信息。

除了故障转移之外,这对于 LDAP 负载均衡也很有用。只需使用一个随机生成器函数,每次返回一个不同的空格分隔列表即可。这是因为列表中的第一个主机始终首先尝试。

执行LDAP写入操作时要小心;确保在修改数据库之前始终连接到主服务器,以便副本能够按预期获取更改。

Alexandros Vellis
allie at lsu dot edu
17年前
我真的很希望有一种方法可以向全世界的程序员传达有关绑定和搜索MS AD的信息。这是我第二次遇到“需要搜索整个树”的问题。

对于php(以及apache auth_ldap),当您需要搜索整个树时,需要指定端口3268。否则它会输出部分结果错误。

ldap_connect($server,3268);

我很幸运地与apache搜索整个目录进行了同样的斗争。当我注意到我们的php应用程序的用户身份验证失败时,我立即通过添加此端口规范(以及ldap_set_option($ldapserver, LDAP_OPT_REFERRALS, 0)选项)解决了问题。

我真的希望这能帮助其他人,以免他们拔光头发。我知道我怀念我的头发。
heiglandreas at php dot net
9个月前
如果您在使用ldap-conjnect上的TLS时遇到问题:尽管很多人都在说:TLS_REQCERT=never **永远**不是正确的答案。

查看https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/以了解使用正确的证书检查来解决此问题的方案!
titanrat at bk dot ru
7年前
我发现此函数在php7.0和php5.5之间存在一些差异

Php5 ldap_connect ('host', 0)尝试连接默认端口 - host:389
Php7 ldap_connect ('host', 0)尝试连接host:0并崩溃。
antoine dot php dot net at bonnefoy dot eu
9 年前
您好,

对nemanja的帖子进行一些小的更正。
- 如果连接被防火墙拒绝,则会发出警告(在fsockopen之前添加@)
- fclose参数不正确。

使用这种方法,您可以获得非常好的故障转移功能,例如一家在不同地点拥有十几台DC的公司,这样您的PHP程序在至少有一台DC处于活动状态时将始终具有高可用性。
<?php
function serviceping($_host, $_port = 389, $_timeout = 1) {
$op = @fsockopen($_host, $_port, $errno, $errstr, $_timeout);
if (!
$op) {
echo
"KO!";
return
0;

}
//DC不可用
else {
fclose($op); //显式关闭打开的套接字连接
return 1; //DC已启动并正在运行,我们可以安全地使用ldap_connect连接
}
}

function
ldap_connect_failover($_domain) {
// ##### 静态DC列表,如果您的DNS轮循未设置
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');
// ##### 动态DC列表,按轮循结果排序的反向DNS查找
$dclist = gethostbynamel($_domain);

foreach (
$dclist as $dc) {
if (
serviceping($dc) == true) {
break;
} else {
$dc = 0;
}
}
//在此循环之后,要么至少会有一台DC当前可用,要么$dc将返回布尔值false,而下一行将停止程序继续执行

if (!$dc) {
return
false;
}
//通知用户

return ldap_connect($dc);
}
?>
TheThinkingMan
9 年前
我花费了数小时的时间试图使LDAPS连接与我的本地AD LDS实例(在Windows 8.1 64位上运行)建立连接。

我尝试了各种证书。OpenSSL、Thawte和自签名证书——均未成功。

我最终删除了所有证书,并使用IIS 7(在Windows 8.1上运行)创建了一个自签名证书。

然后我下载了Softerra LDAP浏览器,它能够通过SSL无问题地连接到我的AD LDS实例。

当然,如果它可以,PHP也可以。

我使用了以下代码进行连接
<?php
$ldap_server
= "ldaps://delllappy:636";
$ldap_conn = ldap_connect($ldap_server) or die("无法连接到LDAP服务器。");
?>
我在ldap_connect上方添加了以下内容
<?php
putenv
('LDAPTLS_REQCERT=allow');
putenv("LDAPCONF=C:\OpenLDAP\sysconf\ldap.conf");
?>

这没有效果。

我使用的ldap_bind命令是
<?php
if (!ldap_bind($ldap_conn, $ldap_user, $ldap_pass)) {
echo
"错误";
}else{
echo
"成功";
}
?>
顺便说一句:我也在代码中添加了很多调试信息——它在其他地方有引用——所以我没有在这里添加。

我不断收到的错误是
绑定到LDAP错误:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

然后我运行了ProcMon(来自Microsoft的进程监视器)。

我监视了重新启动Web服务器(Z-WAMP)时的操作。此时,没有尝试读取ldap.conf。

然后我加载了包含test.php文件的网页。

此时,我注意到正在读取ldap.conf,而不是openldap.conf。

当然,由于我的文件名为ldap.conf,openldap.conf失败了。我将ldap.conf重命名为openldap.conf,一切正常。

在运行OpenLDAP的Z-WAMP上,不要使用ldap.conf,请使用openldap.conf。

openldap.conf文件放置在C:\openldap\sysconf\中。

由于PUTENV值没有任何作用,因此我将其删除了。
ac dot russell at live dot com
12年前
为了通过ssl连接到ldap服务器,我需要使用证书。为此,ldap管理员向我发送了一个.der文件,我将其放入/etc/openldap/cacerts中。
cp ldap-server.der /etc/openldap/cacerts
该目录必须为chmod 755。然后,以下条目必须位于/etc/openldap/ldap.conf中

# 使连接容易受到MITM攻击
# 通过不检查任何证书
# 有关更好的解决方案,请参阅https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
LDAPTLS_REQCERT never
TLS_CACERTDIR /etc/openldap/cacerts
“TLS_REQCERT never”仅在证书链中存在自签名证书时才需要。
csnyder at fcny dot org
15 年前
需要重复说明(并且示例可能应该更新),ldap_connect()实际上并没有测试与指定的ldap服务器的连接。如果您尝试在基于ldap的身份验证例程中构建故障转移,这一点非常重要。

测试连接的唯一方法是实际调用ldap_bind( $ds, $username, $password )。但是,如果失败,是因为用户名/密码错误还是因为连接断开?据我所知,没有办法分辨。

似乎,如果ldap_bind()对主服务器失败,则别无选择,只能使用相同的凭据对备份服务器尝试ldap_bind()。然而,如果您的组织限制了登录失败尝试次数,则单个错误密码将计为两次登录失败尝试。这不好。

一种可能的解决方法是首先尝试匿名绑定

<?php
// 连接到主服务器
$ds = ldap_connect( 'ldap://10.0.0.7/' );
// 注意:即使主服务器关闭,$ds也始终是资源

// 尝试匿名登录以测试连接
$anon = @ldap_bind( $ds );
if ( !
$anon ) {
// 测试失败,连接到故障转移主机
$ds = ldap_connect( 'ldap://10.0.0.8/' );
}
else {
// 测试通过,取消绑定匿名并重新连接到主服务器
ldap_unbind( $ds );
$ds = ldap_connect( 'ldap://10.0.0.7/' );
}

// 现在尝试真正的登录
$login = @ldap_bind( $ds, $username, $password );
?>

请注意,此解决方法依赖于启用匿名登录,而这并非总是如此。令人遗憾的是,没有其他方法可以测试连接。希望可以在ldap_connect()的未来某个实现中解决此问题。
geigers at binghamton dot edu
16年前

如果你同时使用了oci8和openldap,你可能会遇到问题。我有一个Oracle数据库,它从Apache连接。Oracle也有ldap库,这些库优先于openldap库。这会导致在使用uri风格连接字符串调用ldap_connect时出现段错误;例如,ldap_connect("ldaps://myldapserver.host");

在使用gdb调试核心转储和大量谷歌搜索后,我发现解决方法是在apachectl启动时添加一个环境变量。

我使用的是RHEL上的Apache 2.2.8和PHP 5.2.5。我添加了

LD_PRELOAD=/path/to/libldap.so
export LD_PRELOAD

到/usr/sbin/envvars中,该文件在apachectl启动时被读取。你可以在此处了解更多信息:http://www.mail-archive.com/[email protected]/msg02201.html

Scott Geiger
bleathem at gmail dot com
16年前

每个人都在发布关于在WAMP/AD堆栈中使ldaps://工作的信息,我很难找到如何在RHEL 5.1(使用所有库存rpm)中使其工作。良好的旧strace完成了这项工作,并帮助我找到了问题...

事实证明,php正在/etc/pki/CA中查找CA文件,而我没有该文件夹的正确权限。将其chmod为755解决了我的“无法联系LDAP服务器”消息。
andreas dot a dot sandberg at gmail dot com
17年前
在使用与Solaris捆绑在一起的sun客户端库的ldap_connect时要小心。当使用ldap协议指定主机时,我的连接失败,并且我花了一整天的时间来进行故障排除。例如,ldap_connect("ldap://somwhere.com"); 只需删除“ldap://”并指定主机即可。这是在Solaris 10 sparc上。
elsint at yahoo dot com
18年前
如果使用Windows,请注意证书的权限。

为所有人设置证书的“读取”和“读取和执行”权限,否则你可能会因为此问题而遇到绑定错误。
Srivathsa M
19年前
在NetWare上使用LDAP over SSL

1. 将服务器证书复制到sys:/php5/cert目录。此位置可以在php.ini文件中配置。

2. 在ldap_connect调用中,对主机名参数使用“ldaps://”前缀或对端口号参数使用636的值。

有关更多详细信息,请访问NetWare特定PHP文档:http://developer.novell.com/ndk/doc/php/index.html
nigelf at esp dot co dot uk
19年前
如上所述,即使服务器名称无效,openLDAP也会始终返回一个资源。

如果你然后使用错误抑制(@ldap_bind)进行绑定并且失败,则不清楚是什么导致了失败(即:连接或凭据)。由于绑定不返回资源,因此你无法从ldap_error等获取最后一个错误。

如果你仅向用户显示有关登录失败的消息,他们可能会因重新输入有效的用户名/密码而感到沮丧,而实际上是连接出了问题。
vandervoord at planet dot nl
17年前
关于搜索整个AD树的先前注释完全有效。尽管你必须确保你正在对其进行身份验证/搜索的服务器是全局编录服务器。如果不是,则连接和绑定将失败。通常你的域中至少有一个全局编录服务器,因此如果连接失败,请尝试另一个服务器,它将起作用。它之所以起作用的原因是全局编录服务器搜索整个域,而域编录仅搜索给定的OU,当然这也构成了安全威胁:)...
匿名
22 年前
使用URL作为主机参数时,始终会返回资源ID
即使主机不存在。

"当使用URI描述连接时,(open)ldap库
仅解析URL并检查其是否有效,_不会建立连接_
在这种情况下。
[email protected]
http://bugs.php.net/bug.php?id=15637
mharting at micahtek dot com
15 年前
尝试设置故障转移的补充。在执行ldap_connect后,执行ldap_bind。如果ldap_bind失败,请使用命令ldap_errno获取错误号。如果错误号为81,则表示服务器已关闭。这是我们唯一一次将故障转移到我们的备份ldap服务器的时间。

另一件需要考虑的事情是错误可能是49,然后执行
ldap_get_option($this->ds,LDAP_OPT_ERROR_NUMBER,$optErrorNumber);。这将返回扩展数据,如果该数据代码为532或773,则绑定失败将由密码过期引起,并且需要更新密码才能使绑定成功。
verikono
13年前
PHP:LDAP不支持持久连接。
To Top