Фильтры LDAP в Apache Directory Studio

LDAP позволяет создавать фильтры для поиска записей в службе каталогов.

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

В свободном месте LDAP Browser кликаем правой кнопкой мышки и выбираем New -> New Search

Apache Directory Studio New LDAP Search
New LDAP Search

В Search Name введите имя запроса, например “phoneExists”.

В Search Base нужно выбрать или ввести с клавиатуры DN корневого узла, относительно которого будет выполняться запрос. С помощью кнопки Browse…, расположенной справа от поля ввода выберите dc=urvanov,dc=ru.

Теперь самое интересное — заполнение поля Filter. Сюда мы пишем фильтр LDAP. В начале статьи мы планировали написать фильтр проверки существования поля. Они имеют вид:

(имяАтрибута=*)

Для получения только записей с номерами телефонов в поле Filter нужно ввести:

(telephoneNumber=*)

Должно получиться как на картинке:

LDAP phone exists
LDAP phone exists

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

LDAP Browser phoneExists
LDAP Browser phoneExists

Как видим, было найдено две записи. Отлично.

Теперь попробуем найти записи, у которых атрибут 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”. Мы можем найти созданную запись фильтром:

Думаю, этих знаний будет более чем достаточно для создания большинства фильтров LDAP.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *