【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依赖:

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

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

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

 application.yml 配置如下内容:

spring:ldap:embedded:ldif: classpath:ldap-server.ldifbase-dn: dc=testldap,dc=com
#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配置

spring: #springboot的配置ldap:embedded:ldif: classpath:ldap-server.ldifbase-dn: dc=testldap,dc=comport: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: domaindn: ou=users,dc=testldap,dc=com
objectclass: top
objectclass: organizationalUnit
ou: peopledn: 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.实体类(条目映射)


import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;import javax.naming.Name;/*** @version v1.0* @className LdapUser* @description  与 LADP存储内容进行映射*/
@Entry(base = "ou=users,dc=testldap,dc=com",objectClasses = {"top", "person", "organizationalPerson", "inetOrgPerson"}
)
@Data
public class LdapUserinfo {@Id@JsonIgnoreprivate Name id; // LDAP Distinguished Name (DN)@Attribute(name = "cn") // Common Nameprivate String realName;@Attribute(name = "mobile") // Mobile numberprivate String phone;@Attribute(name = "userPassword")private String password;@Attribute(name = "mail") // E-mail addressprivate String emailAddr;@Attribute(name = "uid")private String userId;}

4.测试工具类 


import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.filter.EqualsFilter;
import org.springframework.ldap.query.ContainerCriteria;
import org.springframework.ldap.query.LdapQueryBuilder;
import org.springframework.stereotype.Component;/*** @version v1.0* @className LdapUtil* @date 2024/5/14*/
@Slf4j
@Component
public class LdapUtil {@Autowiredprivate LdapTemplate ldapTemplate;@Value("${spring.ldap.embedded.base-dn}") private String baseRoot;//从nacos读取的 为了验证能否正常读取nacos,可以不写public LdapUserinfo findUser(String base,String userId, String password) {// 根据uid 和密码 查询用户是否存在log.info("---findUser---userName={} password={} baseRoot={}", userId,password,baseRoot);LdapUserinfo userinfo = null;EqualsFilter filter = new EqualsFilter("uid", userId);base = "ou=users,dc=testldap,dc=com";boolean bool = ldapTemplate.authenticate(baseRoot, filter.toString(), password);if (bool) {// 构建查询条件LdapQueryBuilder builder = LdapQueryBuilder.query();// 根据 uid查询builder.where("uid").is(userId);// 注意LdapUserinfo 类,一定要跟 ldap协议中的属性名称对应userinfo = ldapTemplate.findOne(builder, LdapUserinfo.class);log.info("LdapUserinfo:" + JSONUtil.toJsonStr(userinfo));} else {log.info("未查询到用户");}return userinfo;}public void findUser() {// 构建查询条件LdapQueryBuilder builder = LdapQueryBuilder.query();//builder.base("dc=testldap,dc=com"); yml中已经指定了,这里不需要再指定,重复指定会导致路径解析问题// 根据 uid查询builder.where("cn").is("admin");// 注意LdapUserinfo 类,一定要跟 ldap协议中的属性名称对应AdminUser userinfo = ldapTemplate.findOne(builder, AdminUser.class);log.info("LdapUserinfo:" + JSONUtil.toJsonStr(userinfo));}}

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

 5.执行测试

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

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

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

三、正常连接服务器模式

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

1.yml配置

spring: #springboot的配置ldap:urls: ldap://localhost:389base: dc=testldap,dc=comusername: cn=admin,dc=testldap,dc=compassword: secret

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


import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;
import java.util.HashMap;
import java.util.Map;/*** @version v1.0* @className LdapConfig* @date 2024/5/21* @description 开发配置类LdapConfiguration,初始化连接,创建LdapTemplate*/
@Configuration
public class LdapConfig {private LdapTemplate ldapTemplate;@Value("${spring.ldap.urls}")private String url;@Value("${spring.ldap.base}")private String base;@Value("${spring.ldap.username}")private String username;@Value("${spring.ldap.password}")private String password;@Beanpublic LdapContextSource contextSource() {LdapContextSource contextSource = new LdapContextSource();Map<String, Object> config = new HashMap();contextSource.setUrl(url);contextSource.setBase(base);contextSource.setUserDn(username);// 例:管理员DNcontextSource.setPassword(password);// 例:管理员密码//  解决乱码config.put("java.naming.ldap.attributes.binary", "objectGUID");// 启动时不立即初始化(lazy connection initializing),直到第一次LDAP操作contextSource.setPooled(true);// 调用afterPropertiesSet方法是必须的,它会处理配置并创建初始连接contextSource.setBaseEnvironmentProperties(config);return contextSource;}@Beanpublic LdapTemplate ldapTemplate() {if (null == ldapTemplate) {ldapTemplate = new LdapTemplate(contextSource());}return ldapTemplate;}
}

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

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

根据ldif文件条目设置字段

# testldap.com
dn: dc=testldap,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Organization
dc: testldap# admin, testldap.com
dn: cn=admin,dc=testldap,dc=com
objectClass: organizationalRole
cn: admin

@Entry(objectClasses = {"organizationalRole"})


import lombok.Data;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;import javax.naming.ldap.LdapName;@Entry(objectClasses = {"organizationalRole"})
@Data
public class AdminUser {@Idprivate LdapName dn; // LDAP Distinguished Name (DN)@Attribute(name = "cn")private String commonName;
}

 4.LdapUtil中添加测试方法

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

5.执行测试

打印结果如下:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Context 详解

一、什么是Context&#xff1f; Context是一个抽象基类。在翻译为上下文&#xff0c;是提供一些程序的运行环境基础信息。 Context下有两个子类&#xff0c;ContextWrapper是上下文功能的封装类&#xff08;起到方法传递的作用&#xff0c;主要实现还是ContextImpl&#xff0…

python基础-数据结构-leetcode刷题必看-heapq --- 堆队列算法

文章目录 堆的定义堆的主要操作堆的构建堆排序heapq模块heapq.heappush(heap, item)heapq.heappop(heap)heapq.heappushpop(heap, item)heapq.heapreplace(heap, item)heapq.merge(*iterables, keyNone, reverseFalse)heapq.nlargest(n, iterable, keyNone)heapq.nsmallest(n, …

Linux基础学习笔记

目录 1、Linux安装 1.1 安装教程 1.2 Linux目录结构 2、Linux常用命令 2.1 ls 2.2 命令分类 2.3 目录处理命令 2.4 操作文件命令 2.5 查找文件命令 2.6 ln链接命令 2.7 进程相关命令 ​编辑3、配置网络 3.1 关闭windows防火墙 3.2 配置好虚拟机的局域网 3.3 配置…

汇编原理(四)[BX]和loop指令

loop&#xff1a;循环 误区&#xff1a;在编译器里写代码和在debug里写代码是不一样的&#xff0c;此时&#xff0c;对于编译器来说&#xff0c;就需要用到[bx] [bx]: [bx]同样表示一个内存单元&#xff0c;他的偏移地址在bx中&#xff0c;比如下面的指令 move bx, 0 move ax,…

永恒之蓝(MS17-010)详解

这个漏洞还蛮重要的&#xff0c;尤其在内网渗透和权限提升。 目录 SMB简介 SMB工作原理 永恒之蓝简原理 影响版本 漏洞复现 复现准备 复现过程 修复建议 SMB简介 SMB是一个协议服务器信息块&#xff0c;它是一种客户机/服务器、请求/响应协议&#xff0c;通过SMB协议…

dubbo复习:(11)使用grpc客户端访问tripple协议的dubbo 服务器

一、服务器端依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

【kubernetes】陈述式资源管理的kubectl命令合集

目录 前言 一、K8s 资源管理操作方式 1、声明式资源管理方式 2、陈述式资源管理方式 二、陈述式资源管理方式 1、kubectl 命令基本语法 2、查看基本信息 2.1 查看版本信息 2.2 查看资源对象简写 2.3 配置kubectl命令自动补全 2.4 查看node节点日志 2.5 查看集群信息…

01 Nginx安装部署(系列篇)

一、安装部署 1、Nginx的发行版本 常用版本分为四大阵营&#xff1a; Nginx 开源版 | https://nginx.org/&#xff1a;赤裸裸的Web服务器、反向代理、负载均衡&#xff08;功能少&#xff0c;开发难度大&#xff09; Nginx Plus 商业版 | https://www.nginx.com/&#xff1a;…

高职物联网专业嵌入式系统开发教学解决方案

前言 随着人工智能与物联网技术的深度融合&#xff0c;物联网&#xff08;AIoT&#xff09;已成为推动产业发展的重要力量。高职物联网专业作为培养技术人才的重要基地&#xff0c;面临着课程体系更新、教学内容优化的迫切需求。嵌入式系统开发作为物联网专业的核心课程之一&a…

[CVPR-24] HUGS: Human Gaussian Splats

本文提出一种新的数字人表征Human Gaussian Splats (HUGS)&#xff0c;可以实现新姿态和新视角生成&#xff1b;本文提出一种新的前向形变模块&#xff08;forward deformation module&#xff09;&#xff0c;在标定空间基于Gaussians表征数字人&#xff0c;并基于LBS学习如何…

秘钥托管技术简介

目录 前言 一、秘钥托管是什么&#xff1f; 二、秘钥托管技术简介 1. Skipjack算法 2. LEAF产生过程示意图 3. 对加密通信的法律实施存取过程 总结 前言 1993年4月&#xff0c;美国政府为了满足其电信安全、公众安全和国家安全&#xff0c;提出了托管加密标准EES (escro…

Aria2下载安装使用

目录 下载Aria2 配置创建 aria2.conf 文件创建 aria2.session 文件 Aria2的使用基础使用多源下载多线程下载后台下载配置文件启动 AriaNg下载安装AriaNg配置AriaNg使用 Tracker 列表 aria2 是一款免费开源跨平台且不限速的多线程下载软件&#xff0c;其优点是速度快、体积小、资…

慧尔智联携纷享销客启动CRM项目 推进客户经营升级与内外高效协作

智慧农业领军企业慧尔智联携手纷享销客&#xff0c;启动CRM客户经营管理系统项目。双方将深入合作&#xff0c;全面落实慧尔智联发展策略&#xff0c;持续提升数字化经营管理水平&#xff0c;实现内部团队信息化高效协作&#xff0c;以快速响应市场需求&#xff0c;提升客户满意…

开源集运wms系统

集运WMS系统是一种专为集运业务设计的仓库管理系统&#xff0c;它能够高效地处理来自多个来源的货物&#xff0c;优化存储和发货流程。 经过长时间的开发和测试&#xff0c;推出了我的集运WMS系统。它不仅具备传统WMS系统的所有功能&#xff0c;还针对集运业务的特点进行了特别…

HNU-计算机体系结构-小班讨论-GoogleTPU的发展历程与思考

因为对GPU比较感兴趣&#xff0c;故选择这个作为汇报课题。

JEPaaS 低代码平台 accessToTeanantInfo SQL注入漏洞复现

0x01 产品简介 JEPaaS低代码开发平台开源版 旨在帮助企业快速实现信息化和数字化转型。该平台基于可视化开发环境,让软件开发人员和业务用户通过直观的可视化界面来构建应用程序 ,而不是传统的编写代码方式。 用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和…

智能合约革命:Web3引领智能化商业的未来

随着区块链技术的日益成熟和普及&#xff0c;智能合约作为其重要应用之一&#xff0c;正在逐渐改变着商业世界的面貌。Web3作为下一代互联网的代表&#xff0c;以其去中心化、加密安全的特性&#xff0c;为智能合约的发展提供了无限可能&#xff0c;将智能合约应用于商业领域的…

使用控制台方式部署sentinel

1.下载控制台jar包 2.运行jar包 java -jar sentinel-dashboard-1.8.0.jar 也可以通过编写批处理文件指定端口、用户名、密码&#xff1a; 客户端添加依赖&#xff08;后续整合springcloudalibaba时不需要此依赖&#xff09; 如修改了sentinel端口&#xff0c;需要添加客户端运…

Springboot项目搭建 jdk1.8

1.idea创建项目 2.项目配置 maven 编辑项目编码 删除无用文件 修改配置文件后缀&#xff0c;设置数据库 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/honey2024?useSSLfalse&useUnicodetrue&characterEncodingUT…

AI绘画Stable Diffusion XL 可商用模型!写实艺术时尚摄影级真实感大模型推荐(附模型下载)

大家好&#xff0c;我是设计师阿威 大家在使用AI绘画的时候&#xff0c;是不是遇到这种问题&#xff1a;收藏的模型确实很多&#xff0c;可商用的没几个&#xff0c;而今天阿威将给大家带来的这款写实艺术时尚摄影级真实感大模型-墨幽人造人XL&#xff0c; 对于个人来讲完全是…