0

我正在编写一个 php 代码来连接到我的 LDAP 服务器。

$adServer = $ini['ldap'];
$ldap = ldap_connect($adServer) or die("Could not connect to {$adServer}");

$adServer我从配置文件中获取的值。

当我传递空白值或任何其他随机值(如“Hello”)时,看起来ldap_connect()不会引发错误。

我尝试提供以下代码来检查是否生成了任何错误消息。

echo ldap_error($ldap)

它总是说“成功”。

因此,我无法验证与 LDAP 服务器的连接是否已建立并抛出适当的错误消息。

在什么情况下会触发“死”ldap_connect()功能。如果配置文件中提供的服务器名称不起作用,我想向最终用户抛出适当的错误消息。

注意:我正在为 PHP 使用 5.6 版

4

2 回答 2

2

ldap_connect()当它可以将提供的参数解析为 URL 时,总是返回一个资源。第一次实际使用该资源(因此建立了连接并可以检测到可能的故障)是在使用ldap_bind().

ldap_connect() 几乎总是返回一个资源句柄(如http://php.net/ldap_connect所述),您的构造die()不会做您想要的。仅当提供的参数无法在内部解析为 URL 时,它才会起作用。因此,只要您提供一个看起来像服务器名称或 URL 的字符串,一切正常。

我总是在失败后检查ldap_bind()到底发生了什么,然后根据返回的错误抛出异常。或者,我有时会在使用之前ldap_bind()通过打开(并关闭)使用 fi 的连接进行检查fsockopen()。如果无法打开该连接,则 ldap-connection 也将不起作用。

引用的 php-documentation 上的示例具有误导性,看来我们必须更改它们。因此,感谢您发现并提出问题!

顺便说一句:例如调用@ldap_connect('ldap:');将是这样一种情况,die()因为它是一个不完整的 URL。或者使用带空格的字符串。

于 2015-08-20T08:54:55.223 回答
0

我找到了一种更好的方法来进行身份验证,而不是使用 die。在 ldap connect 之后,我们将继续使用 ldap bind。如果绑定失败,那么我们可以检查 ldap 错误。

$ldap = @ldap_connect($adServer);
$bind = @ldap_bind ($ldap, $ldaprdn, $password);
if (!$bind) {  // If Bind Failed then.
    if (ldap_errno ($ldap) == 49 {
        //Invalid Credentials
    } else {
    //LDAP Connection to LDAP Server Failed
    }
}

有关所有 LDAP 错误号的列表,您可以在此处查看

于 2015-10-13T06:13:55.287 回答