Вы можете подумать, что простая аутентификация пользователя в 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.