Spring Data LDAP指南

2023/05/17

1. 简介

在本文中,我们将重点介绍Spring Data LDAP集成和配置。有关Spring LDAP的分步介绍,请快速查看这篇文章

此外,可以在此处找到Spring Data JPA指南的概述。

2. Maven依赖

让我们首先添加所需的Maven依赖项:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-ldap</artifactId>
    <version>2.6.2</version>
</dependency>

spring-data-ldap的最新版本可以在这里找到。

3. Entry

Spring LDAP项目提供了通过使用Object-Directory Mapping(ODM)将LDAP条目映射到Java对象的能力。

让我们定义将用于映射已在Spring LDAP文章中配置的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类似于JPA/ORM的@Entity,用于指定哪个实体映射到LDAP条目的目录根。

Entry类必须在表示实体DN的javax.naming.Name类型的字段上声明@Id注解。@Attribute注解用于将对象类字段映射到实体字段。

4. Spring Data Repository

Spring Data Repository是一种抽象,它为各种持久性存储提供了开箱即用的基本数据访问层实现。

Spring框架在内部为Repository中的给定类提供了CRUD操作的实现。我们可以在Spring Data JPA简介文章中找到完整的详细信息。

Spring Data LDAP提供了类似的抽象,它提供了Repository接口的自动实现,包括LDAP目录的基本CRUD操作。

此外,Spring Data框架可以根据方法名称创建自定义查询

让我们定义将用于管理User条目的Repository接口:

@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框架将自动提供基本的CRUD方法实现,例如find()、findAll()、save()、delete()等。

此外,我们还声明了一些自定义方法。Spring Data框架将通过使用称为查询构建器机制的策略探测方法名称来提供实现。

5. 配置

我们可以使用基于Java的@Configuration类或XML命名空间来配置Spring Data LDAP。让我们使用基于Java的方法配置Repository:

@Configuration
@EnableLdapRepositories(basePackages = "cn.tuyucheng.taketoday.ldap.**")
public class AppConfig {
}

@EnableLdapRepositories提示Spring扫描给定包以查找标记为@Repository的接口。

6. 使用Spring Boot

在处理Spring Boot项目时,我们可以使用Spring Boot Starter Data Ldap依赖项,它将自动为我们检测LdapContextSource和LdapTemplate

要启用自动配置,我们需要确保在pom.xml中将spring-boot-starter-data-ldapStarter或spring-ldap-core定义为依赖项:

<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
}

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 Repository配置和CRUD操作的基础知识。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章