Назад | Перейти на главную страницу

Полезность абсолютного фильтра для запроса LDAP?

Я просматривал исходный код OpenLDAP и видел, где корневая DSE поддерживает так называемые абсолютные фильтры. Похоже, это указано в RFC4526 Похоже, что автор, который изначально составлял его, работал над проектом OpenLDAP, поэтому я не знаю, полезно ли это для этой конкретной реализации или что-то в этом роде.

Во всяком случае, RFC дает такое определение:

   An 'and' filter consisting of an empty set of filters SHALL evaluate
   to True.  This filter is represented by the string "(&)".

   An 'or' filter consisting of an empty set of filters SHALL evaluate
   to False.  This filter is represented by the string "(|)"

Мой вопрос: в чем польза от этого? Я не могу вспомнить ни одного примера, где это дает возможность делать то, что вы не могли сделать раньше. Если вы хотите абсолютного AND тогда ты не можешь сделать (objectClass=*) фильтровать, поскольку все записи должны иметь хотя бы один класс объектов?

Единственное, для чего я могу придумать применение, это Absolute False. Может случиться так, что вы просто хотите, чтобы сервер не работал, чтобы убедиться, что связь по-прежнему работает нормально. Это все еще в некотором роде избыточно, поскольку я думаю, что запрос корневого DSE и отбрасывание результатов будут делать то же самое и не могут быть такими дорогостоящими в вычислительном отношении.

Использование фильтра в ldapsearch дает результаты, которые, я думаю, я должен ожидать, учитывая приведенное выше:

[root@hypervisor openldap]# ldapsearch -x -H ldap://policyServer.trunkator.com -b '' -s base "(|)" +
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (|)
# requesting: +
#

# search result
search: 2
result: 0 Success

# numResponses: 1
[root@hypervisor openldap]#

Использование фильтра absolute true возвращает то же самое, как если бы я сделал (objectClass=*) (который является фильтром по умолчанию для OpenLDAP ldapsearch client, если вы не укажете его в командной строке).

Согласно RFC, они удалили их из исходного LDAPv3 RFC, и поэтому автор столкнулся с проблемой их добавления обратно. в и мне просто интересно, почему (я уверен, что причина есть).

Любые идеи?

РЕДАКТИРОВАТЬ:

Немного неудачной формулировки вверху: когда я говорю «корневой DSE поддерживает», более ясный способ сказать это то, что корневой DSE в OpenLDAP жестко запрограммирован, чтобы сообщить, что он поддерживает абсолютные фильтры.

В разделах «Аннотация» и «Предпосылки» RFC четко указано, что эта функция не была реализована в LDAP v3. Концепция абсолютных фильтров, по-видимому, является частью X.500 / DAP, и они призваны помочь при запросе записей, специфичных для DSA, с которыми может не быть связан объектный класс. Хотя это, очевидно, не является специфической функцией производителя, ее реализация оставлена ​​на усмотрение поставщика (например, OpenLDAP, похоже, реализовал ее). Кажется не очень полезным, если используемое программное обеспечение каталога связывает все записи, включая специфичные для DSA, с объектным классом (например, top), что делает фильтр '(objectclass = *)' функционирующим так, как будто это абсолютный фильтр что приводит к "истине". Если программное обеспечение каталога не связывает записи, относящиеся к DSA, с объектным классом или другим атрибутом, конкретное значение которого при поиске принимает значение «истина», тогда абсолютный фильтр, действующий как переключатель истинно / ложно, становится своего рода обязательной функцией ( если программное обеспечение каталога не предоставляет проприетарный способ получения таких записей, что, вероятно, не является хорошей идеей, поскольку такая нестандартная реализация вынудит клиентов LDAP быть ограниченными / специфичными для поставщика).

Я подозреваю, что это упрощает определенные программные конструкции. Например, если вы создаете в своем коде выражения фильтра следующим образом:

filter_string='(&'
for filter in filters:
    filter_string = filter_string + '(' + filter + ')'
filter_string = filter_string + ')'

... то в случае, если у вас нет фильтров, вы заканчиваете (&), и часть RFC, которую вы выделили, определяет, как это должно себя вести. То же самое верно и для (|).