Используйте ldap_modify для обновления записи ldap. Все довольно просто:
$entry['mail'] = 'example@domain.com';
$entry['cn'] = 'test';
ldap_modify($connection, $dn, $entry);
userPassword
- это операционный атрибут .
Операционный атрибут используется внутренне сервером. Как правило, он читается, но не может быть изменен пользователем.
Чтобы получить операционный атрибут , вы должны явно его потребовать или запросить все их, используя специальный атрибут +
(как вы сделали с *
, чтобы запросить всех пользователя атрибуты).
Вы также можете запросить все (как пользовательские, так и рабочие) атрибуты с помощью:
ldap_search($connection, $base_dn, $filter, ['*', '+']);
Теперь вы хотите сравнить представленный пароль пользователя со строкой хеша пароля, хранящейся в AD. Это означает, что вам нужно вручную зашифровать / хэшировать / засолить переданную строку в соответствии со схемой хеширования, используемой в AD (например, {SSHA}, {SHA}, {SMD5}, {MD5}, {CRYPT}, ...
), чтобы сравнение было возможным.
Вот пример того, как вручную создать хеш {MD5} на основе открытого текста пароля:
$hash = '{md5}' . base64_encode(pack('H*', md5($clear_txt_passwd)));
=> Это не так просто, и совпадение не гарантируется, даже если входная строка верна, так как вы можете столкнуться с проблемами взаимодействия между реализациями ldap и / или системами / ОС (хэш-функции / соли могут отличаться от одного до другой, особенно с использованием библиотеки crypt
, которая зависит от системы).
Если вы хотите проверить аутентификацию пользователя непосредственно на AD, просто используйте ldap_bind :
$bind = ldap_bind($connection, $dn, $passwd); // returns TRUE on success, FALSE on failure.
echo "$dn\n" . ($bind ? 'LDAP bind OK' : 'LDAP bind failed');
Но если, например, необходимо проверять учетные данные пользователей как на существующем сервере openLdap, так и на AD, для этого потребуется постоянно синхронизировать / реплицировать записи пользователя, вместо этого лучше сохранить один единый сервер аутентификации. В таком случае вам придется использовать сквозную аутентификацию с использованием выделенной схемы {SASL}
в 1-м бэкэнде (в данном примере openLDAP): в этой конфигурации Cyrus SASL используется в качестве обработчика пароля, а делегирует проверку пароля на любой внутренний сервер с поддержкой SASL для проверки паролей (в вашем случае AD, но это может быть Kerberos или IMAP-сервер).