LDAP позволяет создавать фильтры для поиска записей в службе каталогов.
Начнём с создания самого простого фильтра проверки существования атрибута. В Apache Directory Studio с заполненной базой данных (см. предыдущую статью).
В свободном месте LDAP Browser кликаем правой кнопкой мышки и выбираем New -> New Search…

В Search Name введите имя запроса, например “phoneExists”.
В Search Base нужно выбрать или ввести с клавиатуры DN корневого узла, относительно которого будет выполняться запрос. С помощью кнопки Browse…, расположенной справа от поля ввода выберите dc=urvanov,dc=ru.
Теперь самое интересное — заполнение поля Filter. Сюда мы пишем фильтр LDAP. В начале статьи мы планировали написать фильтр проверки существования поля. Они имеют вид:
(имяАтрибута=*)
Для получения только записей с номерами телефонов в поле Filter нужно ввести:
(telephoneNumber=*)
Должно получиться как на картинке:

Кликните мышкой на кнопку Search. В LDAP Browser должен появиться новый узел phoneExists внутри узла Searches:

Как видим, было найдено две записи. Отлично.
Теперь попробуем найти записи, у которых атрибут sn равен Scout. Повторим все те же действия, дадим другое имя запросу, а фильтр пишем вот так:
(sn=Scout)
Должна найтись одна запись cn=Theodour,ou=Marketing Department,dc=urvanov,dc=ru.
Аналогично составляются фильтры с меньше или равно и больше или равно, но вместо символа «=» для них используется «<=» и «>=» соответственно.
В LDAP нет возможности строить фильтры с операцией строго меньше, и нет возможности строить фильтры с операцией строго больше!
Можно использовать символ «*», для составления шаблонов строк. Примеры:
(cn=Con*) — поиск всех строк, начинающихся с “Con”.
(cn=*ith) — поиск всех строк, заканчивающихся на “ith”.
(cn=odo) — поиск всех вхождений подстроки “odo”.
Есть такое понятие, как «приблизительное соответствие». Я не понял, для чего это. Судя по статьям в интернете, реализация зависит от сервера. Выглядит это примерно так:
(cn=~Smith)
Но у меня в Apache Directory Server это так и не заработало. Не знаю, почему.
Также существуют расширяемые фильтры. Ни один из них у меня в Apache Directory Server не заработал (все выдавали пустые результаты). Если кто-нибудь знает, почему, то подскажите, пожалуйста. Примеры:
(cn:=Smith) — то же самое, что и (cn=Smith)
(cn:dn:=Smith) — должно искать Smith в атрибуте cn или внутри dn должно быть cn=Smith. У меня не заработало.
(cn:caseIgnoreMatch:=Smith) — сравнение атрибута cn с игнорированием регистра символов.
Можно группировать условия логическим И и логическим ИЛИ. Формат:
(&(условие1)(условие2)) — условие1 ИСТИНА и условие2 ИСТИНА.
(|(условие1)(условие2)) — условие2 ИСТИНА или условие2 ИСТИНА.
Примеры:
(|(cn=Tom)(cn=Smith)) — искать записи, где cn=Tom или cn = Smith.
(&(telephoneNumber=88000000000)(sn=Ivanova)) — искать записи, где telephoneNumber=88000000000 и sn=Ivanova.
Также можно использовать логическое НЕ. Для этого используется восклицательный знак. Пример:
(!(sn=Ivanova))
Есть ещё одна хитрость. Значения атрибутов могут содержать специальные символы, используемые в фильтрах. Например, создайте ещё один organizationalPerson, но пропишите у него cn=s()*. Как теперь создавать фильтры? Вместо открывающейся скобки нужно подставлять “\28”, вместо закрывающейся скобки нужно подставлять “\29”, вместо звёздочки нужно подставлять “\2a”. Мы можем найти созданную запись фильтром:
1 |
(cn=s\28\29\2a) |
Думаю, этих знаний будет более чем достаточно для создания большинства фильтров LDAP.