我正在写一个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()
函数。
如果配置文件中提供的服务器名称不起作用,我想向最终用户抛出相应的错误消息。
注意:我使用的是5.6版本的PHP
答案 0 :(得分:1)
ldap_connect()
在将提供的参数解析为URL时始终返回资源。第一次实际使用该资源(因此建立连接并且可以检测到可能的故障)是在使用ldap_bind()
时。
由于ldap_connect()
几乎总是返回资源句柄(如http://php.net/ldap_connect中所述),您的die()
构造将无法执行您想要的操作。只有在内部无法将提供的参数解析为URL时,它才会起作用。因此,只要您提供外观的字符串,如服务器名称或URL,一切正常。
我总是在不成功ldap_bind()
之后检查发生了什么,然后根据返回的错误抛出异常。或者,我有时会在使用ldap_bind()
之前通过使用f.i fsockopen()
打开(并关闭)连接来检查。如果无法打开该连接,则ldap-connection也将无效。
关于引用的php文档的示例是误导性的,似乎我们将不得不改变它们。所以感谢发现和抛出问题!
BTW:例如,调用@ldap_connect('ldap:');
会导致die()
工作,因为它是一个不完整的URL。或者使用带有空格的字符串。
答案 1 :(得分:0)
我找到了一种更好的方法来进行身份验证而不是使用死亡。 在ldap连接之后,我们将继续使用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错误号的列表,您可以查看here