Рубрики
Без рубрики

Весенний обзор LDAP

Узнайте, как использовать API Spring LDAP для проверки подлинности и поиска пользователей, а также для создания и изменения пользователей на сервере каталогов.

Автор оригинала: baeldung.

Весенний обзор LDAP

1. Обзор

Серверы каталогов LDAP являются оптимизированными иерархическими магазинами данных. Как правило, они используются для хранения информации, связанной с пользователем, необходимой для проверки подлинности и авторизации пользователей.

В этой статье мы изумим API Spring LDAP для проверки подлинности и поиска пользователей, а также для создания и изменения пользователей на сервере каталогов. Тот же набор API может быть использован для управления любым другим типом записей в LDAP.

2. Мейвен зависимостей

Начнем с добавления требуемой зависимости Maven:


    org.springframework.ldap
    spring-ldap-core
    2.3.1.RELEASE

Последнюю версию этой зависимости можно найти на весенне-ldap-основной .

3. Подготовка данных

Для целей этой статьи давайте сначала создадим следующую запись LDAP:

ou=users,dc=example,dc=com (objectClass=organizationalUnit)

Под этим узелом мы создадим новых пользователей, изменим существующих пользователей, проявим аутентификацию существующих пользователей и будем искать информацию.

4. Весенние API LDAP

4.1. КонтекстИсточник: Определение LdapTemplate Bean

КонтекстИсточник используется для создания LdapTemplate . Мы увидим использование КонтекстИсточник во время проверки подлинности пользователя в следующем разделе:

@Bean
public LdapContextSource contextSource() {
    LdapContextSource contextSource = new LdapContextSource();
    
    contextSource.setUrl(env.getRequiredProperty("ldap.url"));
    contextSource.setBase(
      env.getRequiredProperty("ldap.partitionSuffix"));
    contextSource.setUserDn(
      env.getRequiredProperty("ldap.principal"));
    contextSource.setPassword(
      env.getRequiredProperty("ldap.password"));
    
    return contextSource;
}

LdapTemplate используется для создания и модификации записей LDAP:

@Bean
public LdapTemplate ldapTemplate() {
    return new LdapTemplate(contextSource());
}

4.2. Проверка подлинности пользователей

Давайте теперь реализуем простую часть логики для проверки подлинности существующего пользователя:

public void authenticate(String username, String password) {
    contextSource
      .getContext(
        "cn=" + 
         username + 
         ",ou=users," + 
         env.getRequiredProperty("ldap.partitionSuffix"), password);
}

4.3. Создание пользователей

Далее давайте создадим нового пользователя и храним хэш SHA пароля в LDAP.

Во время проверки подлинности сервер LDAP генерирует хэш SHA поставляемого пароля и сравнивает его с сохраненным:

public void create(String username, String password) {
    Name dn = LdapNameBuilder
      .newInstance()
      .add("ou", "users")
      .add("cn", username)
      .build();
    DirContextAdapter context = new DirContextAdapter(dn);

    context.setAttributeValues(
      "objectclass", 
      new String[] 
        { "top", 
          "person", 
          "organizationalPerson", 
          "inetOrgPerson" });
    context.setAttributeValue("cn", username);
    context.setAttributeValue("sn", username);
    context.setAttributeValue
      ("userPassword", digestSHA(password));

    ldapTemplate.bind(context);
}

дайджестША () это пользовательский метод, который возвращает закодированную строку хэша SHA предоставленного пароля Base64.

Наконец, связывать () метод LdapTemplate используется для создания записи на сервере LDAP.

4.4. Модификация пользователя

Мы можем изменить существующего пользователя или запись следующим способом:

public void modify(String username, String password) {
    Name dn = LdapNameBuilder.newInstance()
      .add("ou", "users")
      .add("cn", username)
      .build();
    DirContextOperations context 
      = ldapTemplate.lookupContext(dn);

    context.setAttributeValues
      ("objectclass", 
          new String[] 
            { "top", 
              "person", 
              "organizationalPerson", 
              "inetOrgPerson" });
    context.setAttributeValue("cn", username);
    context.setAttributeValue("sn", username);
    context.setAttributeValue("userPassword", 
      digestSHA(password));

    ldapTemplate.modifyAttributes(context);
}

lookupContext () метод используется для найдите поставляемого пользователя.

4.5. Поиск пользователей

Мы можем искать существующих пользователей с помощью поисковых фильтров:

public List search(String username) {
    return ldapTemplate
      .search(
        "ou=users", 
        "cn=" + username, 
        (AttributesMapper) attrs -> (String) attrs.get("cn").get());
}

АтрибутыМаппер используется для достижения желаемого значения атрибута из найденных записей. Внутренне, Весенние LdapTemplate вызывает АтрибутыМаппер для всех найденных записей создается список значений атрибутов.

5. Тестирование

весенне-ldap-тест предоставляет встроенный сервер LDAP на базе ApacheDS 1.5.5. Чтобы настроить встроенный сервер LDAP для тестирования, нам нужно настроить следующую весеннюю фасоль:

@Bean
public TestContextSourceFactoryBean testContextSource() {
    TestContextSourceFactoryBean contextSource 
      = new TestContextSourceFactoryBean();
    
    contextSource.setDefaultPartitionName(
      env.getRequiredProperty("ldap.partition"));
    contextSource.setDefaultPartitionSuffix(
      env.getRequiredProperty("ldap.partitionSuffix"));
    contextSource.setPrincipal(
      env.getRequiredProperty("ldap.principal"));
    contextSource.setPassword(
      env.getRequiredProperty("ldap.password"));
    contextSource.setLdifFile(
      resourceLoader.getResource(
        env.getRequiredProperty("ldap.ldiffile")));
    contextSource.setPort(
      Integer.valueOf(
        env.getRequiredProperty("ldap.port")));
    return contextSource;
}

Давайте проверьте наш метод поиска пользователей с JUnit:

@Test
public void 
  givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() {
    List users = ldapClient
      .search(SEARCH_STRING);
 
    assertThat(users, Matchers.containsInAnyOrder(USER2, USER3));
}

6. Заключение

В этой статье мы ввели API Spring LDAP и разработали простые методы проверки подлинности пользователей, поиска пользователей, создания и модификации сервера LDAP.

Как всегда, полный исходный код доступен в этот проект Github . Тесты создаются под профилем Maven “live” и, следовательно, могут быть запущены с использованием опции “-P live”.