Ответ 1
Общая процедура была бы (соответствующие команды ext/ldap php в скобках):
-
подключиться к LDAP-серверу с помощью "LDAP Host" и "LDAP port no" (ldap_connect()) и установить правильное (ldap_set_option()), особенно
LDAP_OPT_PROTOCOL_VERSION
иLDAP_OPT_REFERRALS
-
привязать к LDAP-серверу, используя "учетную запись LDAP для привязки" и "пароль учетной записи LDAP" (ldap_bind()) - если вы проверяете подлинность на сервере Active Directory, вы можете напрямую использовать имя пользователя и пароль со страницы входа и пропустить все следующие шаги.
-
найдите дерево для соответствующей пользовательской записи/объекта, указав "BASE DN" и соответствующий фильтр LDAP - скорее всего, что-то вроде
(&(objectClass=user)(sAMAccountName=%s))
, где%s
следует заменить на имя пользователя для аутентификации (ldap_search()) -
проверить, если количество возвращаемых записей равно 1 (если < > 1, то что-то пошло не так, например, не найдено ни одного пользователя или нескольких пользователей)
-
извлекает отличительное имя (DN) этой единственной записи (ldap_get_dn())
-
используйте DN, найденный на последнем шаге, чтобы попытаться связать сервер LDAP с паролем, указанным на странице аутентификации (ldap_bind())
-
если связывание завершается успешно, все в порядке, если нет, скорее всего пароль неверен
Это действительно не так сложно, как кажется сначала. Как правило, я предлагаю использовать некоторую стандартную библиотеку для аутентификации на сервере LDAP, например, Net_LDAP2
PEAR-пакет или Zend_Ldap
из Zend Framework. У меня нет опыта использования Net_LDAP2
(хотя я знаю код довольно хорошо), но Zend_Ldap
отлично работает с серверами Active Directory или серверами ADAMS (что, очевидно, с чем вы работаете).
Это сделает трюк с помощью Zend_Ldap
:
$options = array(
'host' => 'ad.blueroom.ac.uk',
'useStartTls' => true,
'accountDomainName' => 'blueroom.ac.uk',
'accountCanonicalForm' => 4,
'baseDn' => 'ou=bluebird,dc=bluebird,dc=ac,dc=my',
);
$ldap = new Zend_Ldap($options);
try {
$ldap->bind('user', 'password');
} catch (Zend_Ldap_Exception $e) {
// something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);