Можно подумать, что простая аутентификация пользователя в Active Directory будет довольно простым процессом с использованием LDAP в PHP без необходимости в библиотеке. Но есть много вещей, которые могут усложнить это довольно быстро:
- Вы должны подтвердить ввод. В противном случае пустое имя пользователя / пароль будет проходить.
- Вы должны убедиться, что имя пользователя / пароль правильно закодированы при привязке.
- Вы должны шифровать соединение, используя TLS.
- Использование отдельных серверов LDAP для резервирования в случае сбоя одного из них.
- Получение информационного сообщения об ошибке в случае сбоя аутентификации.
На самом деле в большинстве случаев проще использовать библиотеку LDAP, поддерживающую вышеуказанное. В конечном итоге я развернул собственную библиотеку, которая обрабатывает все перечисленные выше пункты: LdapTools (ну, не только для аутентификации, он может сделать гораздо больше). Его можно использовать следующим образом:
use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;
$domain = (new DomainConfiguration('example.com'))
->setUsername('username') # A separate AD service account used by your app
->setPassword('password')
->setServers(['dc1', 'dc2', 'dc3'])
->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);
if (!$ldap->authenticate($username, $password, $message)) {
echo "Error: $message";
} else {
// Do something...
}
Вызов для аутентификации выше:
- Проверьте, что ни имя пользователя, ни пароль не пусты.
- Убедитесь, что имя пользователя / пароль правильно закодированы (по умолчанию UTF-8)
- Попробуйте использовать альтернативный сервер LDAP, если он не работает.
- Шифровать запрос аутентификации с использованием TLS.
- Предоставьте дополнительную информацию в случае сбоя (например, заблокированная / отключенная учетная запись и т. Д.)
Есть и другие библиотеки для этого (например, Adldap2). Однако я чувствовал себя достаточно вынужденным, чтобы предоставить некоторую дополнительную информацию, так как ответ с наибольшим количеством голосов на самом деле представляет собой угрозу безопасности, на которую можно положиться без проверки входных данных и без использования TLS.