Фильтр LDAP для пустого (пустого) атрибута
Я искал эту тему, но все, что я нашел, это фильтры, возвращающие записи, в которых нет определенного атрибута, например:
(!(manager=*))
Однако я хочу найти записи, в которых присутствует атрибут, но имеет нулевое значение (т.е. пустую/пустую строку). Могу ли я это сделать, используя фильтр LDAP, и если да, то как?
EDIT:
Чтобы подтвердить, указанный выше фильтр находит записи без атрибута, но не там, где атрибут пуст (пустая строка).
Является ли это зависимым от реализации LDAP или что?
Ответы
Ответ 1
Из LDAP не существует метода запроса для определения пустой строки.
Лучшей практикой было бы очистить ваши входы данных до LDAP, поскольку пустое или нулевое значение в LDAP вообще не имеет значения.
Чтобы определить это, вам нужно будет запросить для всех со значением (manager = *), а затем использовать код для определения тех, которые были "пробелом" или нулевым значением.
И, как сказал Терри, неправильное хранение пустого или нулевого значения в атрибуте синтаксиса DN.
Некоторые реализации сервера LDAP не разрешают вводить DN, где запись DN не существует.
Возможно, вы могли бы, если ваше DN согласовано, используйте что-то вроде:
(&(!(manager=cn*))(manager=*))
Это должно возвращать любое значение менеджера, где было значение для менеджера, и оно не начиналось с "cn".
Однако некоторые реализации LDAP не разрешают поиск подстроки по атрибутам синтаксиса DN.
-Джит
Ответ 2
Найдите нулевое значение с помощью \00
Например:
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme 'manager=\00' uid manager
Убедитесь, что вы используете нулевое значение в командной строке, чтобы использовать кавычки вокруг него, чтобы оболочка ОС не отправляла нулевой символ в LDAP. Например, это не сработает:
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme manager=\00 uid manager
Существуют различные сайты, которые ссылаются на это, наряду с другими специальными символами. Пример:
Ответ 3
Эта статья http://technet.microsoft.com/en-us/library/ee198810.aspx привела меня к решению. Единственное изменение - это размещение восклицательного знака.
(!manager=*)
Кажется, работает так, как хотел.
Ответ 4
Семантически нет разницы между этими случаями в LDAP.
Ответ 5
Определение схемы для атрибута определяет, должен ли атрибут иметь значение. Если атрибут manager
в приведенном примере - это атрибут, определенный в RFC4524 с OID 0.9.2342.19200300.100.1.10
, тогда этот атрибут имеет синтаксис DN. Синтаксис DN - это последовательность относительных отличительных имен, а не должна быть пустой. Фильтр, приведенный в примере, используется для того, чтобы сервер каталогов LDAP возвращал только записи, которые не имеют атрибута manager
для клиента LDAP в результатах поиска.
Ответ 6
Мне нужно было сделать запрос, чтобы получить все группы с установленным значением managedBy (не пустым), и это дало хорошие результаты:
(!(!managedBy=*))