Операция Search
Операция Search позволяет клиенту запрашивать выполнение поиска на сервере. Это может использоваться для чтения атрибутов из единственной записи, из записей, непосредственно следующих за конкретной записью, или из целого поддерева записей.
SearchRequest определяется следующим образом:
SearchRequest ::= [APPLICATION 3] SEQUENCE { baseObject LDAPDN, scope ENUMERATED { baseObject (0), singleLevel (1), wholeSubtree (2) }, derefAliases ENUMERATED { neverDerefAliases (0), derefInSearching (1), derefFindingBaseObj (2), derefAlways (3) }, sizeLimit INTEGER (0 .. maxInt), timeLimit INTEGER (0 .. maxInt), typesOnly BOOLEAN, filter Filter, attributes AttributeDescriptionList } Filter ::= CHOICE { and [0] SET SIZE (1..MAX) OF Filter, or [1] SET SIZE (1..MAX) OF Filter, not [2] Filter, equalityMatch [3] AttributeValueAssertion, substrings [4] SubstringFilter, greaterOrEqual [5] AttributeValueAssertion, lessOrEqual [6] AttributeValueAssertion, present [7] AttributeDescription, approxMatch [8] AttributeValueAssertion, extensibleMatch [9] MatchingRuleAssertion } SubstringFilter ::= SEQUENCE { type AttributeDescription, -- по крайней мере один должен -- присутствовать, initial и final могут -- быть только один раз substrings SEQUENCE OF CHOICE { initial [0] AssertionValue, any [1] AssertionValue, final [2] AssertionValue } } MatchingRuleAssertion ::= SEQUENCE { matchingRule [1] MatchingRuleId OPTIONAL, type [2] AttributeDescription OPTIONAL, matchValue [3] AssertionValue, dnAttributes [4] BOOLEAN DEFAULT FALSE }
Перечислим параметры SearchRequest:
Сервер должен вычислить фильтры. Результатом вычисления фильтра должно быть либо TRUE, либо FALSE, либо Undefined. Если фильтр вычисляет TRUE для конкретной записи, то атрибуты данной записи возвращаются как часть результата поиска. Если фильтр вычисляет FALSE или Undefined, то данная запись при поиске игнорируется.
Правило соответствия для элемента фильтра equalityMatch определяется правилом соответствия EQUALITY для типа атрибута.
15.1. Область baseObject
15.2. Область singleLevel
15.3. Область wholeSubtree
Правило соответствия для AssertionValues фильтра определяется правилом соответствия SUBSTR для типа атрибута.
Правило соответствия для элементов фильтра greaterOrEqual и lessOrEqual определяется правилом соответствия ORDERING для типа атрибута.
Семантика соответствия для элементов фильтра approxMatch определяется реализацией.
- Attributes: список атрибутов, возвращаемый для каждой записи, которая соответствует фильтру поиска. Могут использоваться два специальных значения: пустой список без атрибутов и атрибут, описываемый строкой "*". Оба значения говорят о том, что возвращаются все атрибуты пользователя.
Атрибуты должны быть поименованы самое большее один раз в списке и возвращаться самое большее один раз в записи. Если в списке существуют описания атрибутов, которые не распознаны, они игнорируются сервером.
Если клиент не хочет, чтобы возвращались какие-либо атрибуты, он может указать список, содержащий только атрибут с OID "1.1". Этот OID был выбран произвольно и не соответствует никакому используемому атрибуту.
Следует заметить, что если запрошены все атрибуты пользователя, некоторые атрибуты записи могут не включаться в результаты поиска в соответствии с политикой управления доступом или другими ограничениями. Более того, серверы не будут возвращать атрибуты выполнения, такие как objectClasses или attributeTypes, если они явно не перечислены, т.к. эти атрибуты могут иметь большое число значений.
Результаты поиска вычисляются сервером после получения им SearchRequest и возвращаются в SearchResponses, которые являются сообщениями LDAP, содержащими типы данных SearchResultEntry, либо SearchResultReference, либо SearchResultDone.
SearchResultEntry ::= [APPLICATION 4] SEQUENCE { objectName LDAPDN, attributes PartialAttributeList } PartialAttributeList ::= SEQUENCE OF SEQUENCE { type AttributeDescription, vals SET OF AttributeValue } -- следует заметить, что PartialAttributeList -- может иметь ноль элементов (если ни один -- из атрибутов затребованной записи не может -- быть возвращен) и что множество vals может -- также иметь ноль элементов (если запрошены -- только типы или все значения были -- исключены из результата) SearchResultReference ::= [APPLICATION 19] SEQUENCE OF LDAPURL -- по крайней мере один элемент LDAPURL -- должен присутствовать SearchResultDone ::= [APPLICATION 5] LDAPResult
После получения SearchRequest сервер будет выполнять необходимый поиск в DIT.
Сервер может возвращать как найденные записи (SearchResultEntry), так и ссылки на другие серверы для продолжения поиска (SearchResultReference).
Для завершения поиска клиент может создать новую операцию поиска для каждого полученного SearchResultReference.
Например, предположим, что сервер (hosta), с которым соединяются, имеет запись DC=Example, DC=NET и запись CN=Manager, DC=Example, DC=NET. Он знает, что один из LDAP-серверов, hostb или hostc, имеет поддерево OU=People, DC=Example, DC=NET и что LDAP-сервер hostd имеет поддерево OU=Roles, DC=Example, DC=NET. Если сделан запрос поиска по поддереву DC=Example, DC=NET, он может возвратить следующее:
SearchResultEntry for DC=Example,DC=NET SearchResultEntry for CN=Manager,DC=Example, DC=NET SearchResultReference { ldap://hostb/OU=People,DC=Example,DC=NET ldap://hostc/OU=People,DC=Example,DC=NET } SearchResultReference { Lightweight Directory Access Protocol Version 3 ldap://hostd/OU=Roles,DC=Example,DC=NET } SearchResultDone (success)
В качестве продолжения примера, если клиент соединяется с сервером hostb и создает запрос для поддерева "OU=People, DC=Example, DC=NET", сервер может вернуть следующее:
SearchResultEntry for OU=People,DC=Example,DC=NET SearchResultReference { ldap://hoste/OU=Managers,OU=People, DC=Example,DC=NET } SearchResultReference { ldap://hostf/OU=Consultants,OU=People, DC=Example,DC=NET } SearchResultDone (success)
Если сервер, с которым установлено соединение, не имеет базового объекта для поиска, то он возвращает клиенту ссылку (referral). Например, если клиент запросил у hosta поиск поддерева DC=Example, DC=ORG, сервер может вернуть только SearchResultDone, содержащий referral.
SearchResultDone (referral) { ldap://hostg/DC=Example,DC=ORG??sub }
Содержание раздела