1. Введение
В этой статье мы сосредоточимся на интеграции и настройке Spring Data LDAP. Пошаговое введение в Spring LDAP можно найти в этой статье .
Кроме того, вы можете найти обзор руководства Spring Data JPA здесь .
2. Зависимость от Maven ****
Начнем с добавления необходимых зависимостей Maven:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-ldap</artifactId>
<version>1.0.6.RELEASE</version>
</dependency>
Последние версии можно найти здесь для spring-data-ldap .
3. Вход в домен
Проект Spring LDAP предоставляет возможность сопоставлять записи LDAP с объектами Java с помощью Object-Directory Mapping (ODM) .
Давайте определим объект, который будет использоваться для сопоставления каталогов LDAP, которые уже были настроены в статье Spring LDAP .
@Entry(
base = "ou=users",
objectClasses = { "person", "inetOrgPerson", "top" })
public class User {
@Id
private Name id;
private @Attribute(name = "cn") String username;
private @Attribute(name = "sn") String password;
// standard getters/setters
}
@Entry
аналогичен @Entity
(из JPA/ORM), который используется для указания того, какая сущность сопоставляется с корнем каталога записей LDAP.
Класс Entry
должен иметь аннотацию @Id
, объявленную в поле типа javax .naming.Name,
которое представляет DN
сущности . Аннотация @Attribute
используется для сопоставления полей класса объекта с полями сущности.
4. Весенний репозиторий данных
Spring Data Repository — это абстракция, которая предоставляет готовую базовую готовую к использованию реализацию уровней доступа к данным для различных хранилищ сохраняемости.
Spring Framework внутренне обеспечивает реализацию операций CRUD для данного класса в репозитории данных. Мы можем найти полную информацию в статье « Введение в Spring Data JPA ».
Spring Data LDAP предоставляет аналогичную абстракцию, которая обеспечивает автоматическую реализацию интерфейсов репозитория , которые включают базовую операцию CRUD для каталогов LDAP.
Кроме того, Spring Data Framework может создать собственный запрос на основе имени метода.
Давайте определим наш интерфейс репозитория, который будет использоваться для управления входом пользователя:
@Repository
public interface UserRepository extends LdapRepository<User> {
User findByUsername(String username);
User findByUsernameAndPassword(String username, String password);
List<User> findByUsernameLikeIgnoreCase(String username);
}
Как мы видим, мы объявили интерфейс, расширив LdapRepository
для записи User.
Spring Data Framework автоматически предоставит реализацию базовых методов CRUD, таких как find()
, findAll()
, save(),
delete() и
т. д.
Кроме того, мы объявили несколько пользовательских методов. Spring Data Framework предоставит реализацию, проверив имя метода с помощью стратегии, известной как механизм построителя запросов .
5. Конфигурация
Мы можем настроить Spring Data LDAP, используя классы @Configuration
на основе Java или пространство имен XML. Давайте настроим репозиторий, используя подход на основе Java:
@Configuration
@EnableLdapRepositories(basePackages = "com.foreach.ldap.**")
public class AppConfig {
}
@EnableLdapRepositories подсказывает
Spring сканировать данный пакет на наличие интерфейсов, помеченных как @Repository.
6. Использование Spring Boot
При работе над проектом Spring Boot мы можем использовать зависимость Spring Boot Starter Data Ldap , которая автоматически будет использовать для нас LdapContextSource
и LdapTemplate
.
Чтобы включить автоконфигурацию, нам нужно убедиться, что у нас есть spring-boot-starter-data-ldap
Starter или spring-ldap-core
, определенные как зависимость в нашем pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
Для подключения к LDAP нам необходимо указать параметры подключения в application.properties:
spring.ldap.url=ldap://localhost:18889
spring.ldap.base=dc=example,dc=com
spring.ldap.username=uid=admin,ou=system
spring.ldap.password=secret
Подробнее об автонастройке Spring Data LDAP можно прочитать в официальной документации . Spring Boot добавляет LdapAutoConfiguration , который заботится об инструментарии LdapTemplate
, который затем можно внедрить в требуемый класс обслуживания:
@Autowired
private LdapTemplate ldapTemplate;
7. Бизнес-логика
Давайте определим наш сервисный класс, который будет использовать UserRepository
для работы с каталогами LDAP:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// business methods
}
Теперь мы рассмотрим одно действие за раз и посмотрим, насколько легко мы можем выполнить это действие с помощью Spring Data Repository.
7.1. Аутентификация пользователя
Давайте теперь реализуем простую логику для аутентификации существующего пользователя:
public Boolean authenticate(String u, String p) {
return userRepository.findByUsernameAndPassword(u, p) != null;
}
7.2. Создание пользователя
Далее создадим нового пользователя и сохраним хэш пароля:
public void create(String username, String password) {
User newUser = new User(username,digestSHA(password));
newUser.setId(LdapUtils.emptyLdapName());
userRepository.save(newUser);
}
7.3. Модификация пользователя
Мы можем изменить существующего пользователя или запись следующим методом:
public void modify(String u, String p) {
User user = userRepository.findByUsername(u);
user.setPassword(p);
userRepository.save(user);
}
7.4. Поиск пользователя
Мы можем искать существующих пользователей, используя собственный метод:
public List<String> search(String u) {
List<User> userList = userRepository
.findByUsernameLikeIgnoreCase(u);
if (userList == null) {
return Collections.emptyList();
}
return userList.stream()
.map(User::getUsername)
.collect(Collectors.toList());
}
8. Пример в действии
Наконец, мы можем быстро протестировать простой сценарий аутентификации:
@Test
public void givenLdapClient_whenCorrectCredentials_thenSuccessfulLogin() {
Boolean isValid = userService.authenticate(USER3, USER3_PWD);
assertEquals(true, isValid);
}
9. Заключение
В этом кратком руководстве продемонстрированы основы настройки репозитория Spring LDAP и работы с CRUD.
Пример, использованный в этой статье, можно найти на GitHub .