2015-10-27 3 views
0

Я работаю над приложением, которое использует LDAP для аутентификации. В настоящее время я могу аутентифицировать пользователей, используя uid и password. Я тестирую с онлайн тестом LDAP-сервером (http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/#comment-5882)Как выполнить привязку LDAP к заданному адресу электронной почты и паролю в PHP?

Это мой код:

<?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

Спасибо за ответ и ваше время, но было бы лучше, если бы вы могли отредактировать ответ Зорана Регварта вместо повторной публикации. –

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

Do не забудьте проверить данный $mail для правильного синтаксиса электронной почты, как вы можете страдать от проблемы безопасности - инъекция LDAP.

+0

это показывает ошибку «ldap_search() ожидает параметр 4, чтобы быть массивом, строка, заданная» –

+0

@Cubetremirez обновленного ответа –

+0

Только для записи : Вы не должны пропускать первый '' 'ldap_bind''' на анонимной привязке, так как это плохая практика. Просто вызовите '' 'ldap_bind ($ ldapConn)' '' без имени пользователя и пароля. – heiglandreas