Январь 13

LDAP filters

Основной формат

( filter )

Фильтры всегда заключаются в круглые скобки.

Простые фильтры с одним выражением

attr=value # соответствие (может содержать поисковые шаблоны)
attr~=value # примерное соответствие
attr>=value # больше чем
attr<=value # меньше чем
ИЛИ
objectclass=class

Примечание: Тип проводимого сравнения, например с учётом или без учёта регистра символов, определяется свойствами используемого в сравнении атрибута и формой поиска (может быть EQUALITYORDERING или SUBSTR). В некоторых случаях используемая при поиске строка называется substring, это верно лишь в том случае, если она содержит один или несколько поисковых шаблоновОпределение атрибута.

В приведённом выше листинге:

соответствие (=) считается истинным, если найдено либо совпадение EQUALITY (без поисковых шаблонов в value), либо совпадение SUBSTR (при наличии одного или нескольких поисковых шаблонов в value).

примерное соответствие (~=) считается истинным, если найдено совпадение с помощью одного из двух алгоритмов поиска ‘созвучных слов’. Требуется индекс типа approx.

больше чем (>=) считается истинным, когда при лексикографическом сравнении value с содержимым указанного атрибута последнее будет лексикографически равно или больше (то есть возвращаются все строки, в которых значение указанного атрибута лексикографически равно или больше value). Данная форма поиска работает только в том случае, если у атрибута есть правило ORDERING, то есть с очень немногими атрибутами.

меньше чем (<=) считается истинным, когда при лексикографическом сравнении value с содержимым указанного атрибута последнее будет лексикографически равно или меньше (то есть возвращаются все строки, в которых значение указанного атрибута лексикографически равно или меньше value). Данная форма поиска работает только в том случае, если у атрибута есть правило ORDERING, то есть с очень немногими атрибутами.

Поисковые шаблоны (wildcard)

Поисковый шаблон * может использоваться отдельно (самостоятельно) как индикатор наличия (то есть в данной записи существует такой атрибут, или в данной записи существует такой объектный класс), либо как классическое итерационное значение, в этом случае его присутствие означает «в позиции * могут находиться 0 или более любых символов». В форме objectclass=obj поисковые шаблоны могут использоваться только в качестве индикатора наличия.

Примеры простых поисковых выражений

(mail=*) # возвращает все записи, у которых есть атрибут mail
(objectclass=*) # возвращает все записи
(mail=*@*) # возвращает записи, значение атрибута mail которых соответствует правильному почтовому адресу формата RFC822
(sn=smith) # возвращает точное соответствие Smith, но НЕ Smit
(sn=s*) # возвращает записи с фамилиями, начинающимися на s или S
(cn=*a*i*) # возвращает записи, в общепринятых именах которых присутствуют сразу a и i в любом месте
(telephonenumber=*555) # возвращает записи с телефонными номерами, оканчивающимися на 555
(objectclass=person) # возвращает записи, в которых используется объектный класс person

Примечания:

  1. При поиске с фильтром objectclass=person также возвращаются записи с любыми объектными классами, использующими в своей иерархии person, например, записи с объектными классами inetOrgPerson или residentialPerson и т.д.
  2. Форма выполнения тестирования также зависит от определения атрибутов (определения ASN.1). Например, sn и cn являются частью семейства атрибутов name, при определении которого задано правило соответствия caseIgnoreMatch, означающее, что соответствие будет искаться БЕЗ учёта регистра символов, то есть при поиске с фильтром sn=a будут найдены и a, и A.

Простые фильтры с комбинированными выражениями

Два или более выражения могут быть объединены (или вложены) с помощью & (логическое И), ! (логическое НЕ) и | (логическое ИЛИ):

(&(exp1)(exp2)(exp3)) # exp1 И exp2 И exp3
(|(exp1)(exp2)(exp3)) # exp1 ИЛИ exp2 ИЛИ exp3
(!(exp1)) # НЕ exp1
(&(!(exp1))(!(exp2))) # НЕ exp1 И НЕ exp2

НЕ (!) смотрится несколько проблематично, зато логично (может быть), и работает только в приведённой выше форме. Смотрите также примеры ниже:

Примеры простых фильтров с комбинированными выражениями

(&(mail=*)(cn=*r)(sn=s*)) # есть атрибут mail И cn заканчивается на R И sn начинается с s
(|(sn=a*)(sn=b*)(sn=c*)) # sn начинается с a ИЛИ с b ИЛИ с c
(!(sn=a*)) # записи с sn НЕ начинающимся с a
(&(!(sn=a*))(!(sn=b*))) # записи с sn НЕ начинающимся с a И НЕ начинающимся с b
(|(sn=*a)(!(sn=s*))) # записи с sn, заканчивающимся на a И НЕ начинающимся с s
# классическия простая ошибка:
(&(sn=a*)(sn=b*)(sb=c*)) # условие невыполнимо, никогда ничего не возвращается

Поиск специальных символов

Если требуется поиск по шаблону, включающему специальные символы (* ) ( \ или NULL), эти символы должны быть экранированы с использованием формата ‘\code’, где code — два шестнадцатеричных символа, представляющие ASCII-код символа. Аналогично поиск по любому двоичному значению может быть осуществлён с помощью его шестнадцатеричного представления.

\2a заменяет или экранирует *
\28 заменяет или экранирует (
\29 заменяет или экранирует )
\5c заменяет или экранирует \
\00 заменяет или экранирует NUL
\xx поиск шестнадцатеричного значения
    где хх лежит в диапазоне 00 - FF

Примеры поиска с использованием экранирования

(cn=*\2a*) # поиск символа *, расположенного в любом месте в cn
(file=d:\5cmyfile.html) # поиск d:\myfile
(description=*\28*\29) # поиск ( и ), расположенных в любом месте, но в этой последовательности
(bin=\5b\04) # поиск двоичного значения 5b04

Расширение возможностей поиска соответствия

Поведение по умолчанию при поиске по любому атрибуту определяется правилами соответствия данного атрибута отдельно для разных типов поиска (EQUALITY, SUBSTR или ODERING). Это поведение может быть переопределено путём указания заменяющего правила соответствия (либо имени правила, либо его OID).

# для sn поведение по умолчанию при сравнении EQUALITY
# caseIgnoreMatch (2.5.13.2)
sn=smith

# переопределим соответствие EQUALITY, чтобы оно зависело от регистра символов
sn:caseExactMatch:=Smith
# то же самое с помощью OID
sn:2.5.13.5:=Smith

# если при поиске встречаются поисковые шаблоны,
# применяется правило соответствия SUBSTR

# для sn поведение по умолчанию при сравнении SUBSTR
# caseIgnoreSubstringMatch
sn=*s* # находит Smith или smith

# переопределим соответствие SUBSTR, чтобы оно зависело от регистра символов
sn:caseExactSubstringMatch:=*S* # находит только Smith
# то же самое с помощью OID
sn:2.5.13.7:=*S*

Используя данный процесс переопределения, можно задавать поисковые критерии, включающие возможности, не определённые в самом атрибуте, такие как ORDERING (которые очень редко встречаются в определениях атрибутов).

Компоненты DN

Существует возможность указать, что любая часть данных из значений атрибутов базового DN может быть также включена в поиск. Это можно сделать с помощью ключевого слова dn внутри поискового выражения, как показано ниже:

# указывает, что значение dc, соответствующее com, может присутствовать в DN 
# или конечная целевая запись определяется базовым DN и диапазоном
dc:dn:=com

Соответствие компонентов (Component Matching) определяется примерно по тому же принципу, что и расширенные фильтры. Оно описано отдельно.