我试图找出一种方法来管理codeigniter在有人错误输入我们的内部网登录的LDAP句柄时抛出的错误。
我们的登录是相当标准的。
登录:firstname.lastname(全部小写以句点分隔)
通过:最少10个字符,需要1个大写字母
一切正常,这确实是一个小问题,但如果有人搞砸了他们的密码或他们的登录名,我就会得到标准的丑陋的codeigniter错误
遇到PHP错误
严重性:警告
消息:ldap_bind():无法绑定到服务器:凭据无效
文件名:controllers / Login.php
行号:28
回溯:
文件:/home/edit/internal/application/controllers/Login.php行:28 功能:ldap_bind
文件:/home/edit/internal/public_html/index.php行:315功能: require_once
我如何能够正确地发布这些内容,因为我可以发送相应的错误消息(您输入了错误的登录详细信息。请记住,这与用于登录工作站的信息相同。)
然后把它扔回来代替丑陋的codeigniter错误。
以下是目前使用的代码......
请注意,DOMAINHERE是我实际域名的替换。
if( $this->input->post( 'login' ) ){
if ($this->form_validation->run())
{
$ldap = ldap_connect( 'DOMAINHERE' ); // Your domain or domain server
if( ! $ldap )
{
// Put something here
}
ldap_set_option( $ldap, LDAP_OPT_PROTOCOL_VERSION, 3 ); // Recommended for AD
$ldapRDN = $this->input->post('username').'@DOMAINHERE.com';
$ldapPWD = $this->input->post('password');
// Now try to authenticate with credentials provided by user
if ( ! ldap_bind( $ldap, $ldapRDN, $ldapPWD) )
{
echo "LDAP Bind Failed.";
$data['error'] = TRUE;
}
else
{
if ( $this -> user_model -> user_exists( $this -> input -> post( 'username' ) ) ) {
$this -> user_model -> process_login();
$this->session->set_userdata('loggedin', TRUE);
redirect( 'welcome' );
} else {
$add_user = $this -> user_model -> set_user_to_db();
if ( $add_user ) {
$this -> session -> set_userdata( 'loggedin', TRUE);
redirect( 'welcome' );
} else {
$this -> session -> set_userdata( 'alert', 'Was unable to add user to the database, please try again later' );
$this -> session -> set_userdata( 'alert_type', 'error' );
redirect( 'login' );
}
}
}
}
}
编辑:我的目标不是抑制警告,事实上警告会在部署期间关闭,而是捕获错误触发的实例,以便我有一些要检查的内容。
答案 0 :(得分:2)
编辑:我不知道Codeigniter,但我已经使用了ldap功能,而且我知道他们在失败时不会返回有用的结果。
理想情况下,您应该在生产环境中禁用警告,这样您就不会看到PHP警告,但是为了辨别出您的LDAP引发了警告,您可能必须具有创造性。此代码显示了两个引发错误的位置,它设置错误级别以隐藏警告,然后有一种机制来测试警告是否被ldap函数搜查。
user_error('Raise an error');
// Suppress Warnings
$previousErrorReportingLevel = error_reporting();
error_reporting( error_reporting() & ~E_WARNING );
$previousError = error_get_last();
if(isset($_POST['username'],$_POST['password']) === true and $ldap_connection = ldap_connect("DOMAINHERE") and $ldap_bind = ldap_bind($ldap_connection,$_POST['username'],$_POST['password']))
{
var_dump($ldap_connection);
var_dump($ldap_bind);
}
else
{
$lastError = error_get_last();
// You can either look for a specific message
if( $lastError['message'] === 'ldap_bind(): Unable to bind to server: Invalid credentials' )
{
echo("Login Credential Error");
}
// or look that the last error is different from the previously recorded error
elseif( $lastError !== $previousError )
{
echo("LDAP Connection error");
}
}
// Restore Error Reporting Level
error_reporting( $previousErrorReportingLevel );
user_error('Raise an error');