Spring Ldap — несколько базовых имен

Я просто пробую весенний ldap/odmnow. Вроде интересно и круто. извините, если вопрос ниже слишком глуп!

Я пытаюсь использовать spring ldap/odm для извлечения некоторых атрибутов из ldap. Есть ли способ настроить несколько базовых имен в

or in

@Entry(objectClasses = { "person"} base={..CAN I GIVE MULTIPLE BASENames here..})
public class LdapUser {

    @Id
    private Name dn;

    //..
}

В приложении, которое я разрабатываю, пользователи определены в одном подразделении, а внутренние ТЕСТЕРЫ определены в другом подразделении в нашей AD. Поэтому я пытаюсь понять, могу ли я использовать один и тот же класс ввода ldap для поиска всех.


person Zak    schedule 02.09.2014    source источник
comment
часть ниже была отредактирована из моего поста выше. Я также хотел знать, есть ли способ настроить несколько базовых имен в ‹ldap:context-source url=${ldap.url} base=${ldap.base} //здесь ..есть ли поддержка, которая будет принимать массив базовых имен username=${userdn} password=${password} /› ‹ldap:ldap-template id=ldapTemplate /›   -  person Zak    schedule 03.09.2014


Ответы (3)


База ContextSource предназначена для указания базы всех операций на ContextSource и обычно устанавливается на DN контроллера домена.

Вы можете использовать ODM без указания базы на @Entry (или используя базовое DN выше в дереве), но в этом случае вы обычно будете использовать аннотацию @DnAttribute, чтобы платформа автоматически создавала DN для вас (в основном это необходимо, когда сохраняющиеся записи обратно в LDAP).

Если предположить, что ваши пользователи находятся в следующей структуре:

dc=example,dc=com,ou=USERS

dc=example,dc=com,ou=TESTERS

Теперь, если вы укажете базу dc=example,dc=com в ContextSource, вы можете заставить ODM обрабатывать это автоматически, как кратко описано ниже:

@Entry(objectclasses={"person"})
public class Person {
  @Id
  private Name dn;

  @DnAttribute(name="ou", index=0)
  @Transient // Indicates that this is not an attribute on the entry
  private String userType;

  @Attribute(name="cn")
  private String name;

  // More attributes here
}

Вышеупомянутое будет обрабатывать автоматическое сопоставление записей LDAP с классом Person и из него. Теперь, если вы хотите найти всех людей, выполните:

List<Person> allPersons = ldapTemplate.findAll(Person.class);

Если вы хотите найти всех тестировщиков, вы должны сделать:

List<Person> testers = ldapTemplate.find(
                            query().base("ou=TESTERS"), 
                            Person.class);
person marthursson    schedule 04.09.2014
comment
Спасибо . Я заставил его работать вчера. Определил два источника ldaptemplates/context и класс входа без базового имени и создал ldaptemplate1.findone().. И ldaptemplate2.findone() . Мой req очень прост ... Нужно получить fname и lname из ldap с использованием идентификатора электронной почты ... Я кэширую информацию для последующего чтения ... Не хотел переделывать это. - person Zak; 04.09.2014

Я не очень хорошо знаком с Spring LDAP, но сам (IIRC) LDAP может выполнять поиск только с одного узла (базы). Итак, просмотрев документацию , возможно, вам придется выполнить поиск в организации (o=xx) с помощью LDAPQueryBuilder, добавив условия для ous. См. документы javadocs.

person Gary Russell    schedule 02.09.2014
comment
Спасибо Гэри! Ldapquerybuilder был моим другим вариантом. наверное завтра реализую - person Zak; 03.09.2014

Здесь нет эксперта, заметьте. По крайней мере, с конфигурацией XML вы можете связать экземпляр LdapTemplate. Одним из предложений может быть создание новой реализации, называемой чем-то вроде DelegatingLdapTemplate, которая вводится с двумя обычными шаблонами (по одному на базовое имя), а затем делегирует их соответствующим образом (или просто вызывает один, а затем другой, если первый возвращает 0 результатов), и используйте это вместо обычного экземпляра шаблона. Это, конечно, имеет смысл только в том случае, если ваш вариант использования действительно оправдывает такое поведение (например, если вы никогда не знаете, где искать пользователя и должны проверять оба местоположения). В противном случае просто сделайте два отдельных боба.

person kaqqao    schedule 02.09.2014
comment
Каккао спасибо! Я думал об этих вариантах. Я чувствовал, что они были скорее обходными путями. Я надеялся, что ldap:contextsource возьмет массив базовых имен для простого поиска в ldap записей под разными узлами (ou) и избавит меня от стандартного кода :)... - person Zak; 03.09.2014
comment
Если вы дали ContextSource массив базовых имен, как фреймворк узнает, когда какую базу использовать? - person marthursson; 04.09.2014