PHP-LDAP;密码提示不会';如果输入的密码不正确或未提供域名,则不会显示


PHP LDAP; password prompt doesn't appear if password is entered incorrect or domain name is not provided

我正在尝试实现PHP-LDAP身份验证来验证用户。我正在使用以下代码。但是,如果输入的密码不正确或域名没有提供用户名(以username@domain或域''用户名)。它总是显示"授权失败"。如果用户提供正确的username@domain以及他们可以登录的密码。代码:

session_start();
if (strlen(@$_SERVER['PHP_AUTH_USER']) == 0 || strlen(@$_SERVER['PHP_AUTH_PW']) == 0) {
    header('WWW-Authenticate: Basic realm="test"');
    header('HTTP/1.0 401 Unauthorized');
    echo '<h1>Authorization required</h1>';
    exit;
} else {
    $ldaprdn = $_SERVER['PHP_AUTH_USER'];
    $ldappass = $_SERVER['PHP_AUTH_PW'];
    $ldap_server = 'ldap_server_add';
    $ldapconn = ldap_connect("ldap_server_add") or die("Could not connect to ".$ldap_server." server.");
    $ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);
    if ($ldapbind) {
        if (strrchr($_SERVER['PHP_AUTH_USER'], '@') || strrchr($_SERVER['PHP_AUTH_USER'], '''')) {
            if (strrchr($_SERVER['PHP_AUTH_USER'], '@')) {
                $t = explode('@', $_SERVER['PHP_AUTH_USER']);
                $_SESSION['userid'] = $t[0];
            } else {
                $t = explode('''', $_SERVER['PHP_AUTH_USER']);
                $_SESSION['userid'] = $t[1];
            }
        }
    } else {
        echo "<h1>Authorization failed</h1>";
    }
}

我想不通这个问题。请帮帮我。

只需一个简单的技巧就得到了解决方案,并将上面的代码更改为以下代码:

session_start();
function authenticate() {
    header('WWW-Authenticate: Basic realm="test"');
    header('HTTP/1.0 401 Unauthorized');
    echo '<h1>Authorization required</h1>';
    exit;
}
if (strlen(@$_SERVER['PHP_AUTH_USER']) == 0 || strlen(@$_SERVER['PHP_AUTH_PW']) == 0) {
    authenticate();
} else {
    $ldaprdn = $_SERVER['PHP_AUTH_USER'];
    $ldappass = $_SERVER['PHP_AUTH_PW'];
    $ldap_server = 'ldap_server_add';
    $ldapconn = ldap_connect("ldap_server_add") or die("Could not connect to ".$ldap_server." server.");
    $ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);
    if ($ldapbind) {
        if (strrchr($_SERVER['PHP_AUTH_USER'], '@') || strrchr($_SERVER['PHP_AUTH_USER'], '''')) {
            if (strrchr($_SERVER['PHP_AUTH_USER'], '@')) {
                $t = explode('@', $_SERVER['PHP_AUTH_USER']);
                $_SESSION['userid'] = $t[0];
            } else {
                $t = explode('''', $_SERVER['PHP_AUTH_USER']);
                $_SESSION['userid'] = $t[1];
            }
        }
    } else {
        authenticate();
    }
}