如何在PHP中执行LDAP绑定给定的电子邮件和密码?

时间:2015-10-27 09:54:00

标签: php ldap ldap-query

我正在使用LDAP进行身份验证的应用程序。目前,我可以使用uidpassword对用户进行身份验证。 我正在使用在线LDAP测试服务器(http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/#comment-5882

进行测试

这是我的代码:

<?php
$ldapConn = ldap_connect('ldap.forumsys.com');

ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);

//sample path for authentication
ldap_bind($ldapConn, 'uid=riemann,dc=example,dc=com', 'password');

//example path for searching
$search = ldap_search($ldapConn, "uid=riemann,dc=example,dc=com", "(cn=*)");
$searchData = ldap_get_entries($ldapConn, $search);

print_r($searchData);

代码搜索用户并使用uid属性对其进行身份验证,但现在我想根据用户的电子邮件地址对用户进行身份验证。

2 个答案:

答案 0 :(得分:1)

通常,您的LDAP服务器将允许匿名访问以进行搜索,或者您将绑定(进行身份验证)LDAP服务器以执行搜索,并且再次绑定找到的用户的 DN 及其密码以检查密码。

在您的代码中,您在不使用 bind 作为用户 DN 的情况下执行后续操作来检查他/她的密码。如果LDAP服务器允许匿名搜索,则可以跳过第一个ldap_bind

简而言之,没有正确的错误处理和使用在线LDAP测试服务器:

if(ldap_bind($ldapConn, 'cn=read-only-admin,dc=example,dc=com', 'password')) {
    // search the LDAP tree from dc=example,dc=com looking for entries with 
    // specified mail attribute, returning only the dn and limiting the search
    // to 1 result
    $result = ldap_search($ldapConn, 'dc=example,dc=com', "(mail=$mail)", array('dn'), 0, 1)
    $entries = ldap_get_entries($ldapConn, $result);
    if ($entries['count'] != 1) {
        if (ldap_bind($ldapConn, $entries[0]['dn'], $password)) {
            // user with mail $mail is checked with password $password
        }
    }
}
ldap_close($ldapConn);

不要忘记检查给定的$mail以获取正确的电子邮件语法,因为您可能会遇到安全问题 - LDAP注入。

答案 1 :(得分:0)

起初:归功于@Zoran Regvart。 问题是ldap_search()函数中只有4个参数,请检查$entries['count'] > 0

$ldapConn = ldap_connect('ldap.forumsys.com');
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
$password='password';
$mail = 'riemann@ldap.forumsys.com';
if(ldap_bind($ldapConn, 'cn=read-only-admin,dc=example,dc=com', 'password')) {

            $arr = array('dn', 1);
            $result = ldap_search($ldapConn, 'dc=example,dc=com', "(mail=$mail)", $arr);
            $entries = ldap_get_entries($ldapConn, $result);
                echo "<br><hr>";
                print_r($entries);
            if ($entries['count'] > 0) {
                if (ldap_bind($ldapConn, $entries[0]['dn'], $password)) {
                    // user with mail $mail is checked with password $password
                    echo 'user auth success';
                }else{
                    echo 'user auth failed';
                }
            }

        }
ldap_close($ldapConn);