Как реализовать пользовательский раздел на ApacheDS 1.5.5? - PullRequest
0 голосов
/ 30 апреля 2011

Я реализую пользовательский раздел в Apache DS (внедряю org.apache.directory.server.core.partition.Partition).

Я могу выполнять поиск в моем пользовательском разделе, однакоЯ хочу использовать фильтр (т.е. objectClass = ”person”), мой раздел возвращает все найденные записи без какой-либо фильтрации.

Может ли кто-нибудь привести пример фильтрации записей, возвращаемых методом «поиска», с помощью пользовательского раздела?

Также было бы очень признательно, если бы кто-нибудь указал мне на примеры реализации метода поиска.Мне нужно больше информации, особенно в отношении областей поиска (OBJECT, ONELEVEL или SUBTREE).

Я использую ApacheDS версии 1.5.5.

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Каталог - это дерево.При поиске (записи блока данных протокола поиска) с LDAP в Справочнике вы даете:

  1. DN узла, с которого начинается поиск
  2. Атрибуты, которые вы хотите получить
  3. Фильтр ((& (objectClass = *))
  4. Глубина вашего поиска

Для глубины у вас есть 3 возможности

  • Поддерево: попытаться сопоставить фильтр в рекурсивном поиске с начального узла.
  • OneLevel: попытаться сопоставить фильтр только в узлах под начальным узлом.
  • base:попробуйте сопоставить фильтр с атрибутами nod (используется для получения атрибутов RootDSE).

Если я вернусь к вашей проблеме. Будьте осторожны с тем фактом, что в SCHEMA есть реализация типа, определенного в SCHEMA.Все типы являются производными от типа top. Если я возьму в качестве примера тип inetOrgPerson, вы можете увидеть в SCHEMA, что этот тип является дочерним для organizationalPerson, то есть для chil person, чторебенок top. В данном конкретном случае inetOrgPersonобъект будет иметь его атрибут objectClass, оцененный 4 раза:

objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson

Так что если вы напишите поисковый PDU с фильтром, подобным (& (objectClass = person)), у вас будут объекты, выданные из person,organizationalPerson и inetOrPerson типов в вашем результате.

Еще одна вещь в некоторых инструментах поиска, если фильтр написан плохо или не понимает, используется фильтр по умолчанию ((& (objectClass = *)) (это означает все).

0 голосов
/ 30 мая 2011

Я получил это некоторое время назад, но у меня не было времени опубликовать решение.

На примере этой страницы: Как написать простой пользовательский раздел для apache ds.

Мне удалось построить начальный раздел.Это, однако, не было полезным для моего случая.Было бы замечательно, если бы у ApacheDS была более приятная документация.

Так что для фильтрации я получил письмо из списка разработчиков Apache, в основном объясняющее, что нет классов, которые могли бы вам помочь, вы должны сделать это самостоятельно (пожалуйста, исправьте меня, если я ошибаюсь, так как я заинтересован в улучшении моего кода в ближайшее время).

Например, вы получили фильтр (objectClass = person), тогда вы должны сделать что-то вроде этого:

if(ctx.getFilter().toString().contains("objectClass=person")) {
  //Somehow return entries that only correspond to persons on the data base (were you store your directory entries).
}

На самом деле, обратите внимание, что приведенный выше пример кода не будет работать, поскольку ApacheDS преобразует имена атрибутов в соответствующие им OID.Таким образом, вместо «objectClass» мы получили бы 2.5.6, который является OID для атрибута «objectClass».

Теперь, что касается областей поиска, ответ от JPBlanc говорит об этом в значительной степени, поэтому я не повторюсьчто он сказал.В вашем пользовательском разделе вам нужно написать свой код для обработки дерева по-разному.

Например:

switch (ctx.getScope()) {

  case OBJECT:
    //Find a particular entry on your entry database.
  case ONELEVEL:
    //Find all entries that match directly below a given entry.
  case SUBTREE:
    //Find all entries that match recursively below a given entry.

С уважением.

...