Как выполнить привязку LDAP с указанным адресом электронной почты и паролем в PHP?

Я работаю над приложением, которое использует LDAP для аутентификации. В настоящее время я могу аутентифицировать пользователей, используя uid а также password,
Я тестирую с помощью онлайн-тестового сервера 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 атрибут, но теперь я хочу аутентифицировать пользователей, учитывая их адрес электронной почты.

0

Решение

Сначала: кредит переходит к @Zoran Regvart.
проблема была только 4 параметра в ldap_search() функция, проверьте $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 = '[email protected]';
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);
0

Другие решения

Как правило, ваш сервер LDAP либо разрешит анонимный доступ для поиска, либо вы привязывать (проверка подлинности против) сервера LDAP для выполнения поиска и связать снова с DN найденного пользователя и его пароль для проверки пароля.

В вашем коде вы делаете позже без привязывать как с пользователем 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

По вопросам рекламы [email protected]