Я написал класс ldap-authentication-mode (работающий с Active Directory) и недавно создал новое веб-приложение для другого отдела, который использует этот класс аутентификации.
В основном пользователь вводит свои учетные данные, мой скрипт связывается с AD и проверяет, является ли пользователь членом определенной группы. Аутентификация по паролю работает каждый раз, но проверка членства в группах работает только в том случае, если пользователь не находится в или ниже OU с амперсандом в его имени.
Кажется, проблема в том, что название отдела содержит амперсанд, и, следовательно, организационное подразделение тоже. Несмотря на то, что в AD у меня есть разрешения на изменение имени, наиболее вероятно, что другие приложения обращаются к этому OU по имени, поэтому я не могу его изменить (также я не знаю, есть ли другие OU с амперсандами в именах, где та же проблема может возникнуть позже).
Забавная вещь: если я использую ldp.exe под Windows, я могу без проблем использовать точно такой же фильтр поиска, поэтому я думаю, что это проблема с правильной передачей самого символа (мое приложение использует UTF-8 и символ амперсанда) отображается правильно при извлечении из AD и печати, поэтому я не думаю, что это проблема кодирования)
Строка, которую я использую для создания фильтра:
$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$userdn."))";
куда userdn приходит из другого ldap_search, где я успешно проверил пароль пользователя.
Я действительно споткнулся, потому что я на самом деле извлекаю DN, который я использую для группового запроса, из активного каталога (и кажется, что он правильно экранирован), но не могу использовать его в другом ldap_search.
Я уже пытался избежать / заменить &-Символ с некоторыми альтернативами:
\&
&
%26
и много их вариантов, но все они повторяют одну и ту же ошибку «плохого фильтра».
(PHP версии 5.3.2-1ubuntu4.17)
Кто-нибудь может сказать мне, что я здесь делаю неправильно?
Я наконец-то понял это (через несколько дополнительных часов) — проблема была не в амперсанде, а в том, что это была проблема с выходом — DN моего пользователя также содержал запятую, которая уже была экранирована (так что я на самом деле не думал об этом).
На самом деле мне пришлось преобразовать escape-символ () в chr (0x5c).
Эта статья (krivokuca.net/2012/08/…) имела решение.
Забавная вещь: у меня уже была экранирующая функция, которая конвертировала «\» в «\ 5c», но эта не помогла в этом конкретном случае.
Спасибо за усилия, чтобы помочь мне 🙂
Других решений пока нет …