Весенний обзор 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 Listsearch(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() { Listusers = ldapClient .search(SEARCH_STRING); assertThat(users, Matchers.containsInAnyOrder(USER2, USER3)); }
6. Заключение
В этой статье мы ввели API Spring LDAP и разработали простые методы проверки подлинности пользователей, поиска пользователей, создания и модификации сервера LDAP.
Как всегда, полный исходный код доступен в этот проект Github . Тесты создаются под профилем Maven “live” и, следовательно, могут быть запущены с использованием опции “-P live”.