Spec-Zone .ru
спецификации, руководства, описания, API
След: Именование Java и Интерфейс Каталога
Урок: Усовершенствованные Темы для Пользователей LDAP
Часто Задаваемые Вопросы
Домашняя страница > Именование Java и Интерфейс Каталога > Усовершенствованные Темы для Пользователей LDAP

Часто Задаваемые Вопросы

Этот урок отвечает, что у часто задаваемых пользователей вопросов часто есть при использовании JNDI к доступу службы LDAP. Некоторым из типичных проблем отвечают в Проблеме, Стреляющей в Подсказки урока Операций Именования и Каталога.


  1. Контексты:

  2. Действительно ли контекст безопасен для многопоточного доступа?
  3. Почему провайдер LDAP игнорирует мои свойства среды безопасности?
  4. Почему я продолжаю получать CommunicationException?
  5. Как я могу получить трассировку сообщений LDAP?
  6. Как я использую различный механизм аутентификации, такой как Kerberos?
  7. Я должен включить ssl, изменяя пароль?

    Атрибуты:

  8. Когда я прошу один атрибут, я возвращаю другого. Почему?
  9. Как я знаю тип значения атрибута?
  10. Как я возвращаю значение атрибута в форме кроме Строки или байтового массива?
  11. Почему делает помещение "*", поскольку значение атрибута не работает как ожидалось в моем поиске?

    Поискы:

  12. Почему не делают подстановочные знаки в фильтрах поиска всегда работают?
  13. Почему я возвращаю только n число записей, когда я знаю, что есть больше в каталоге?
  14. Как я передаю средства управления со своим поиском?
  15. Как я узнаю, сколько результатов поиска я возвратился?

    Имена:

  16. Почему я получаю пустую строку как имя в моем SearchResult?
  17. Почему я получаю строку URL как имя в моем SearchResult?
  18. Какой тип параметр Имени передают к методам контекста?
  19. Я могу передать имя, которое я возвращал от NameParser до методов Context?
  20. Каково отношение между именем, которое я использую для свойства Context.SECURITY_PRINCIPAL и каталога?
  21. Почему там странные кавычки и Escape на имена, которые я считал из каталога?
  22. Как я получаю полный DN записи LDAP?

1. Действительно ли контекст безопасен для многопоточного доступа, или я должен блокировать/синхронизировать доступ к контексту?

Ответ зависит от реализации. Это - то, потому что Context и интерфейсы DirContext не определяют требования синхронизации. Реализация Sun LDAP оптимизируется для однопоточного доступа. Если у Вас есть многократные потоки, получающие доступ к тому же самому экземпляру Context, то каждый поток должен заблокировать экземпляр Context при использовании его. Это также применяется к любому NamingEnumeration, который получается из того же самого экземпляра Context. Однако, многократные потоки могут получить доступ к различным экземплярам Context (даже полученные из того же самого начального контекста) одновременно без блокировок.

2. Почему провайдер LDAP игнорирует мои свойства среды безопасности, если я не устанавливаю Context.SECURITY_CREDENTIALS ("java.naming.security.credentials") свойство или устанавливаю его в пустую строку?

Если Вы предоставите пустую строку, то пустой byte/char массив, или null к свойству среды Context.SECURITY_CREDENTIALS, то анонимное связывает, произойдет, даже если свойство Context.SECURITY_AUTHENTICATION было установлено в "simple". Это - то, потому что для простой аутентификации, LDAP требует, чтобы пароль был непуст. Если пароль не предоставляется, то протокол автоматически преобразовывает аутентификацию в "none".

3. Почему я продолжаю получать CommunicationException, когда я пытаюсь создать начальный контекст?

Вы могли бы говорить с сервером, который поддерживает только LDAP v2. См. Разный урок Учебного руководства JNDI для примера того, как установить номер версии.

4. Как я могу проследить сообщение LDAP?

Попытайтесь использовать свойство среды "com.sun.jndi.ldap.trace.ber". Если значение этого свойства является экземпляром java.io.OutputStream, то трассировочная информация о буферах BER, отправленных и полученных провайдером LDAP, пишется тому потоку. Если значением свойства является null, то никакой вывод трассировки не пишется.

Например, следующий код отправит вывод трассировки System.err.

env.put("com.sun.jndi.ldap.trace.ber", System.err);

5. Как я использую различный механизм аутентификации, такой как Kerberos?

Следуйте инструкциям в GSS-API/Kerberos v5 Аутентификация Учебного руководства JNDI для информации о том, как использовать аутентификацию Kerberos. Чтобы использовать другие механизмы аутентификации, см. Использование Произвольного раздела Механизмов SASL учебного руководства JNDI.

6. Я должен включить SSL, изменяя пароль? /

Это действительно зависит от сервера каталогов, который Вы используете. Некоторые серверы каталогов не будут позволять Вам изменять пароль, если SSL не будет включен, но некоторые действительно позволяют это. Хорошо позволить SSL защищать Ваш пароль в канале связи.

7. Когда я прошу один атрибут, я возвращаю другого. Почему?

Название атрибута, которое Вы используете, могло бы быть синонимом для другого атрибута. В этом случае сервер LDAP мог бы возвратить каноническое название атрибута вместо того, который Вы предоставляли. Когда Вы смотрите в Attributes, возвращенном сервером, Вы должны использовать каноническое имя вместо синонима.

Например, "fax" мог бы быть синонимом для канонического названия атрибута "facsimiletelephonenumber". Если Вы попросите "fax", то сервер возвратит атрибут под названием "facsimiletelephonenumber". См. урок Операций Именования и Каталога для деталей о синонимах и других проблемах относительно названий атрибута.

8. Как я знаю тип значения атрибута?

Значением атрибута может быть или java.lang.String или byte[]. См. Разный раздел Учебного руководства JNDI для информации, на которой значения атрибутов возвращаются как byte[]. Чтобы сделать это программно, можно использовать оператор instanceof, чтобы исследовать значение атрибута, которое Вы возвращаете от провайдера LDAP.

9. Как я возвращаю значение атрибута в форме кроме Строки или байтового массива?

В настоящий момент Вы не можете. Провайдер LDAP возвращает только значения атрибута, которые являются или java.lang.String или byte[]. См. Разный раздел Учебного руководства JNDI.

10. Почему делает помещение "*", поскольку значение атрибута не работает как ожидалось в моем поиске?

Когда Вы используете следующую форму search(), значения атрибута обрабатываются как литералы; то есть, атрибут в записи в каталоге, как ожидают, будет содержать точно что значение: search(Name name, Attributes matchingAttrs), Чтобы использовать подстановочные знаки, следует использовать строковые формы фильтра search(), следующим образом. search(Name name, String filter, SearchControls ctls)
search(Name name, String filterExpr, Object[]filterArgs, SearchControls ctls)

Для последней формы подстановочные символы должны появиться в параметре filterExpr, а не в filterArgs. Значения в filterArgs также обрабатываются как литералы.

11. Почему не делают подстановочные знаки в фильтрах поиска всегда работают?

Подстановочный знак, который появляется прежде или после значения атрибута (такой как в "attr=*I*") указывает, что сервер должен искать соответствие значений атрибута при использовании правила соответствия подстроки атрибута. Если у определения атрибута нет правила соответствия подстроки, то сервер не может найти атрибут. Необходимо искать при использовании равенства или "существующего" фильтра вместо этого.

12. Почему я возвращаю только n число записей, когда я знаю, что есть больше в каталоге? Некоторые серверы конфигурируются, чтобы ограничить число записей, которые могут быть возвращены. Другие также ограничивают число записей, которые могут быть исследованы во время поиска. Проверьте свою конфигурацию сервера.

13. Как я передаю средства управления со своим поиском?

Средства управления не объясняются в этом учебном руководстве. Проверьте Учебное руководство JNDI.

14. Как я узнаю, сколько результатов поиска я возвратился?

Следует провести подсчет, поскольку Вы перечисляете через результаты. LDAP не предоставляет эту информацию.

15. Почему я получаю пустую строку как имя в моем SearchResult?

getName() всегда возвращает имя относительно целевого контекста поиска. Так, если целевой контекст удовлетворит фильтр поиска, то возвращенное имя будет, "" (пустое название), потому что это - имя относительно целевого контекста. См. раздел Результатов поиска для деталей.

16. Почему я получаю строку URL как имя в моем SearchResult?

Запись LDAP была получена следующим или псевдоним или отсылка, таким образом, ее именем является URL. См. урок Результатов поиска для деталей.

17. Какой тип параметр Name передают к методам Context И DirContext? - CompoundName или CompositeName?

Строковые формы принимают строковое представление составного имени. Таким образом, использование имени строки эквивалентно вызову new CompositeName(stringName) и передаче результатов к Context/DirContext метод. Параметром Name может быть любой объект, который реализует интерфейс Name. Если это - экземпляр CompositeName, то имя обрабатывается как составное имя; иначе, это обрабатывается как составное имя.

18. Я могу передать имя, которое я возвращал от методов NameParser TO Context?

Это связывается с предыдущим вопросом. Да, Вы можете. NameParser.parse() возвращает составное имя, которое реализует интерфейс Name. Это имя можно передать к методам Context, которые интерпретируют его как составное имя.

19. Каково отношение между именем, которое я использую для свойства Context.SECURITY_PRINCIPAL и каталога?

Можно думать об основном имени как прибывающий из различного пространства имен чем каталог. См. RFC 2829 и раздел Безопасности для деталей о механизмах аутентификации LDAP. Поставщик услуг Sun LDAP принимает строковое имя принципала, которое он передает непосредственно к серверу LDAP. Некоторые серверы LDAP принимают DNs, тогда как другие поддерживают схемы, предложенные RFC 2829.

20. Почему там странные кавычки и Escape на имена, которые я считал из каталога?

Синтаксический анализатор имени LDAP Sun консервативен относительно заключения в кавычки правил, но это однако производит "корректные" имена. Кроме того, помните, что имена записей, возвращенных NamingEnumeration s, являются составными именами, которые могут пасоваться назад к методам Context И DirContext. Так, если имя будет содержать символ, который конфликтует с составным синтаксисом имени (таким как символ наклонной черты вправо "/"), то тогда провайдер LDAP обеспечит кодирование, чтобы гарантировать, что символ наклонной черты будет обработан как часть имени LDAP, а не как составной разделитель имени.

Начните использовать LdapName и классы Rdn, которые включают легкому манипулированию именем.

21. Как я получаю полный DN записи LDAP?

Можно использовать NameClassPair.getNameInNamespace().



Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Конфигурация
Следующая страница: Объекты Java в Каталоге