目前我正在使用ldap_*
函数来处理我的某个Web应用程序的身份验证。我有逻辑,能够检查登录是否有效,但是当用户输入无效的用户名/密码组合ldap_bind()
产生警告,如果可能,我想避免。目前我正在使用@
运算符来抑制此错误,但我很好奇是否有更好的方法来阻止来自ldap_*
的警告,而不会完全关闭PHP中的警告或抑制它们。
警告是
遇到PHP错误
严重性:警告
消息:ldap_bind()[function.ldap-bind]:无法绑定到服务器:凭据无效
文件名:libraries / userauth.php
行号:75
我目前的代码如下:
$uid = "uid=".$username;
$ldapUser = $uid.",ou=***,dc=***,dc=***";
$ds = ldap_connect( $this->ldapURL );
$lb = @ldap_bind( $ds, $ldapUser, $password );
$sr = ldap_search( $ds, $this->ldapBaseDN, $uid );
$info = ldap_get_entries( $ds, $sr );
有没有办法在没有完全打开PHP警告或抑制它的情况下阻止此警告?
答案 0 :(得分:10)
此行为是设计使然,您无法阻止ldap_bind触发无效凭据上的警告。不过你还有一些选择:
@
取消警告在我自己的ldap库中,我使用@
抑制器,但是我听说与将错误转换为Exception相比,这是非常慢的,所以我的建议是使用选项2.如果你没有&#39关注超高性能,然后选项1是一种非常有效的方法。
答案 1 :(得分:1)
另一个非常非常糟糕的想法是使用proc_open('php', ...)
,将badass PHP代码包含在标准输入中,并评估标准输出。例如,在我的情况下,这是在身份验证失败时逃避ldap_bind
异常的唯一方法:
$stdout = null;
$proc = proc_open(
'php',
array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')),
$pipes
);
if (is_resource($proc)) {
fwrite($pipes[0], "<?php
echo ldap_bind(
ldap_connect('$ip_ldap_server'),
'$ldapUser',
'$password'
);
");
fclose($pipes[0]);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
}
if ($stdout == 1) {
// authentication is succesfull;
...
} else {
// authentication failed;
...
}
非常难看的代码......
修改强>
所以...我使用此代码的原因是set_error_handler()
,但最后我找到了this。 @是你最好的选择。
答案 2 :(得分:0)
您也可以这样:
try {
$lb = ldap_bind( $ds, $ldapUser, $password );
} catch (\Exception $e) {
return $e->getMessage();
}