使用LDAP进行Codigniter错误处理

时间:2016-03-28 21:29:30

标签: php codeigniter error-handling ldap

我试图找出一种方法来管理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' );

                    }

                }

            }
        }

    }

编辑:我的目标不是抑制警告,事实上警告会在部署期间关闭,而是捕获错误触发的实例,以便我有一些要检查的内容。

1 个答案:

答案 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');