【问题标题】:Codigniter Error Handling with LDAP使用 LDAP 处理 Codeigniter 错误
【发布时间】:2016-03-28 21:29:30
【问题描述】:

我正在尝试找出一种方法来管理由 codeigniter 抛出的错误,以防有人为我们的 Intranet 登录输入错误的 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 功能: 需要一次

我怎样才能做到这一点,因为我可以发送适当的错误消息(类似于:您输入了不正确的登录详细信息。请记住,这与用于登录您的工作站的信息相同。)

然后把它扔回去代替丑陋的 codeigniter 错误。

下面是目前使用的代码...

请注意,DOMAINHERE(s) 是我的实际域的替代品。

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

                    }

                }

            }
        }

    }

编辑:我的目标不是抑制警告,实际上这些警告在部署过程中会被关闭,而是要捕获错误触发的实例,以便我有一些东西要检查。

【问题讨论】:

标签: php codeigniter error-handling ldap


【解决方案1】:

编辑:我不知道 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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2011-01-13
    • 2014-03-27
    相关资源
    最近更新 更多