当前位置:   article > 正文

【MAC】Spring Boot 集成OpenLDAP(含本地嵌入式服务器方式)

【MAC】Spring Boot 集成OpenLDAP(含本地嵌入式服务器方式)

目录

一、添加springboot ldap依赖:

二、本地嵌入式服务器模式

1.yml配置

 2.创建数据库文件:.ldif

3.实体类

4.测试工具类 

 5.执行测试

三、正常连接服务器模式

1.yml配置

2.连接LDAP服务器配置类,初始化连接,创建LdapTemplate 

3.创建admin用户条目映射类

 4.LdapUtil中添加测试方法

5.执行测试


一、添加springboot ldap依赖:

  1. <!--spring security ldap支持 做认证用,若不做认证只是测试连一下,可以不依赖-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-security</artifactId>
  5. </dependency>
  6. <!--ldap依赖,版本建议和boot版本一致-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-ldap</artifactId>
  10. </dependency>
  11. <!-- unboundid-ldapsdk主要是为了在这里使用嵌入式的LDAP服务端来进行测试操作,所以scope设置为了test,
  12. 实际应用中,会连接真实的、独立部署的LDAP服务器,不需要此项依赖。 -->
  13. <dependency>
  14. <groupId>com.unboundid</groupId>
  15. <artifactId>unboundid-ldapsdk</artifactId>
  16. <scope>test</scope>
  17. </dependency>

二、本地嵌入式服务器模式

在 Spring Boot 应用程序中,您可以使用 application.propertiesapplication.yml 来配置嵌入式 LDAP 服务器。当您使用 spring.ldap.embedded 配置属性时,Spring Boot 会尝试启动一个内嵌的 LDAP 服务器,并加载指定的 LDIF 文件作为初始数据。

 application.yml 配置如下内容:

  1. spring:
  2. ldap:
  3. embedded:
  4. ldif: classpath:ldap-server.ldif
  5. base-dn: dc=testldap,dc=com
  6. #classpath 意味着LDIF文件可以在任何标记为类路径的位置找到,而src/main/resources目录下的内容在构建过程中会被自动加入到类路径中。

这里是如何读取配置并启动内嵌的 LDAP 服务器:

  1. ldif: 这个字段指向一个 LDIF (LDAP Data Interchange Format) 文件。在这个例子中,它指向类路径下的 ldap-server.ldif 文件。Spring Boot 将会在应用启动时从这个文件加载数据到内嵌的 LDAP 服务器中。请确保该 LDIF 文件存在于您项目的资源目录下,例如 src/main/resources/ldap-server.ldif

  2. base-dn: 这是内嵌 LDAP 服务器使用的基本目录名称(Base DN)。在此示例中,所有的 LDAP 数据都将被加载至根目录 dc=testldap,dc=com 下。

当 Spring Boot 应用程序启动时,它会自动配置一个内嵌的 LDAP 服务器并加载 ldap-server.ldif 文件中定义的数据。不需要编写任何额外的代码来启动或初始化 LDAP 服务器;Spring Boot 的自动配置功能会处理这一切。

需要引入两个相关依赖:

unboundid-ldapsdk
spring-boot-starter-data-ldap

通过这种配置,您就可以在本地开发环境中模拟 LDAP 服务,而无需连接到真实的 LDAP 服务器。这在进行集成测试或本地开发时非常有用

1.yml配置

  1. spring: #springboot的配置
  2. ldap:
  3. embedded:
  4. ldif: classpath:ldap-server.ldif
  5. base-dn: dc=testldap,dc=com
  6. port:8389 #默认839

如果ldap-server.ldif和application.yml在相同文件夹下,可以用相对路径,可以不加classpath

我这里配置的时候使用的是nacos 肯定不在相同文件夹下,需要加classpath

 2.创建数据库文件:.ldif

src/test/resources目录下创建ldap-server.ldif文件

文件内容

dn: dc=testldap,dc=com
objectClass: top
objectClass: domain

dn: ou=users,dc=testldap,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people

dn: uid=1,ou=users,dc=testldap,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: zhangsan
sn: zhang
uid: 1
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=

3.实体类(条目映射)

  1. import com.fasterxml.jackson.annotation.JsonIgnore;
  2. import lombok.Data;
  3. import org.springframework.ldap.odm.annotations.Attribute;
  4. import org.springframework.ldap.odm.annotations.Entry;
  5. import org.springframework.ldap.odm.annotations.Id;
  6. import javax.naming.Name;
  7. /**
  8. * @version v1.0
  9. * @className LdapUser
  10. * @description 与 LADP存储内容进行映射
  11. */
  12. @Entry(
  13. base = "ou=users,dc=testldap,dc=com",
  14. objectClasses = {"top", "person", "organizationalPerson", "inetOrgPerson"}
  15. )
  16. @Data
  17. public class LdapUserinfo {
  18. @Id
  19. @JsonIgnore
  20. private Name id; // LDAP Distinguished Name (DN)
  21. @Attribute(name = "cn") // Common Name
  22. private String realName;
  23. @Attribute(name = "mobile") // Mobile number
  24. private String phone;
  25. @Attribute(name = "userPassword")
  26. private String password;
  27. @Attribute(name = "mail") // E-mail address
  28. private String emailAddr;
  29. @Attribute(name = "uid")
  30. private String userId;
  31. }

4.测试工具类 

  1. import cn.hutool.json.JSONUtil;
  2. import lombok.Data;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.ldap.core.AttributesMapper;
  7. import org.springframework.ldap.core.LdapTemplate;
  8. import org.springframework.ldap.filter.EqualsFilter;
  9. import org.springframework.ldap.query.ContainerCriteria;
  10. import org.springframework.ldap.query.LdapQueryBuilder;
  11. import org.springframework.stereotype.Component;
  12. /**
  13. * @version v1.0
  14. * @className LdapUtil
  15. * @date 2024/5/14
  16. */
  17. @Slf4j
  18. @Component
  19. public class LdapUtil {
  20. @Autowired
  21. private LdapTemplate ldapTemplate;
  22. @Value("${spring.ldap.embedded.base-dn}")
  23. private String baseRoot;//从nacos读取的 为了验证能否正常读取nacos,可以不写
  24. public LdapUserinfo findUser(String base,String userId, String password) {
  25. // 根据uid 和密码 查询用户是否存在
  26. log.info("---findUser---userName={} password={} baseRoot={}", userId,password,baseRoot);
  27. LdapUserinfo userinfo = null;
  28. EqualsFilter filter = new EqualsFilter("uid", userId);
  29. base = "ou=users,dc=testldap,dc=com";
  30. boolean bool = ldapTemplate.authenticate(baseRoot, filter.toString(), password);
  31. if (bool) {
  32. // 构建查询条件
  33. LdapQueryBuilder builder = LdapQueryBuilder.query();
  34. // 根据 uid查询
  35. builder.where("uid").is(userId);
  36. // 注意LdapUserinfo 类,一定要跟 ldap协议中的属性名称对应
  37. userinfo = ldapTemplate.findOne(builder, LdapUserinfo.class);
  38. log.info("LdapUserinfo:" + JSONUtil.toJsonStr(userinfo));
  39. } else {
  40. log.info("未查询到用户");
  41. }
  42. return userinfo;
  43. }
  44. public void findUser() {
  45. // 构建查询条件
  46. LdapQueryBuilder builder = LdapQueryBuilder.query();
  47. //builder.base("dc=testldap,dc=com"); yml中已经指定了,这里不需要再指定,重复指定会导致路径解析问题
  48. // 根据 uid查询
  49. builder.where("cn").is("admin");
  50. // 注意LdapUserinfo 类,一定要跟 ldap协议中的属性名称对应
  51. AdminUser userinfo = ldapTemplate.findOne(builder, AdminUser.class);
  52. log.info("LdapUserinfo:" + JSONUtil.toJsonStr(userinfo));
  53. }
  54. }

注:yml中已经指定了base,不需要再指定,重复指定会导致路径解析问题。尽量为空

 5.执行测试

将testldap.ldif中的内容打印出来了

debug时测试内置服务器连接,此时本地的嵌入式服务器是联通的

参考链接:Spring Boot中使用LDAP来统一管理用户信息_ldapquery-CSDN博客 

三、正常连接服务器模式

mac安装openldap详见:Mac上安装OpenLDAP服务器详细教程(Homebrew安装和自带的ldap)-CSDN博客

1.yml配置

  1. spring: #springboot的配置
  2. ldap:
  3. urls: ldap://localhost:389
  4. base: dc=testldap,dc=com
  5. username: cn=admin,dc=testldap,dc=com
  6. password: secret

2.连接LDAP服务器配置类,初始化连接,创建LdapTemplate 

  1. import org.springframework.beans.factory.annotation.Value;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.ldap.core.LdapTemplate;
  5. import org.springframework.ldap.core.support.LdapContextSource;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. /**
  9. * @version v1.0
  10. * @className LdapConfig
  11. * @date 2024/5/21
  12. * @description 开发配置类LdapConfiguration,初始化连接,创建LdapTemplate
  13. */
  14. @Configuration
  15. public class LdapConfig {
  16. private LdapTemplate ldapTemplate;
  17. @Value("${spring.ldap.urls}")
  18. private String url;
  19. @Value("${spring.ldap.base}")
  20. private String base;
  21. @Value("${spring.ldap.username}")
  22. private String username;
  23. @Value("${spring.ldap.password}")
  24. private String password;
  25. @Bean
  26. public LdapContextSource contextSource() {
  27. LdapContextSource contextSource = new LdapContextSource();
  28. Map<String, Object> config = new HashMap();
  29. contextSource.setUrl(url);
  30. contextSource.setBase(base);
  31. contextSource.setUserDn(username);// 例:管理员DN
  32. contextSource.setPassword(password);// 例:管理员密码
  33. // 解决乱码
  34. config.put("java.naming.ldap.attributes.binary", "objectGUID");
  35. // 启动时不立即初始化(lazy connection initializing),直到第一次LDAP操作
  36. contextSource.setPooled(true);
  37. // 调用afterPropertiesSet方法是必须的,它会处理配置并创建初始连接
  38. contextSource.setBaseEnvironmentProperties(config);
  39. return contextSource;
  40. }
  41. @Bean
  42. public LdapTemplate ldapTemplate() {
  43. if (null == ldapTemplate) {
  44. ldapTemplate = new LdapTemplate(contextSource());
  45. }
  46. return ldapTemplate;
  47. }
  48. }

3.创建admin用户条目映射类

根据LDAP 数据结构,你可以创建一个映射到 admin 用户条目的 Java 类。这个类需要使用 Spring LDAP ODM(Object-Directory Mapping)来映射 LDAP 条目的属性到 Java 对象的属性。

根据ldif文件条目设置字段

  1. # testldap.com
  2. dn: dc=testldap,dc=com
  3. objectClass: top
  4. objectClass: dcObject
  5. objectClass: organization
  6. o: Example Organization
  7. dc: testldap
  8. # admin, testldap.com
  9. dn: cn=admin,dc=testldap,dc=com
  10. objectClass: organizationalRole
  11. cn: admin

@Entry(objectClasses = {"organizationalRole"})

  1. import lombok.Data;
  2. import org.springframework.ldap.odm.annotations.Attribute;
  3. import org.springframework.ldap.odm.annotations.Entry;
  4. import org.springframework.ldap.odm.annotations.Id;
  5. import javax.naming.ldap.LdapName;
  6. @Entry(objectClasses = {"organizationalRole"})
  7. @Data
  8. public class AdminUser {
  9. @Id
  10. private LdapName dn; // LDAP Distinguished Name (DN)
  11. @Attribute(name = "cn")
  12. private String commonName;
  13. }

 4.LdapUtil中添加测试方法

  1. public void findUser() {
  2. // 构建查询条件
  3. LdapQueryBuilder builder = LdapQueryBuilder.query();
  4. //builder.base("dc=testldap,dc=com");
  5. // 根据 uid查询
  6. builder.where("cn").is("admin");
  7. // 注意LdapUserinfo 类,一定要跟 ldap协议中的属性名称对应
  8. AdminUser userinfo = ldapTemplate.findOne(builder, AdminUser.class);
  9. log.info("LdapUserinfo:" + JSONUtil.toJsonStr(userinfo));
  10. }

5.执行测试

打印结果如下:

参考链接:springboot 整合 LDAP-阿里云开发者社区

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/642913
推荐阅读
相关标签
  

闽ICP备14008679号