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

news2024/11/15 12:21:21

目录

一、添加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.ldif
      base-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.ldif
      base-dn: dc=testldap,dc=com
      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.实体类(条目映射)


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
    @JsonIgnore
    private Name id; // LDAP Distinguished Name (DN)

    @Attribute(name = "cn") // Common Name
    private String realName;

    @Attribute(name = "mobile") // Mobile number
    private String phone;

    @Attribute(name = "userPassword")
    private String password;

    @Attribute(name = "mail") // E-mail address
    private 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 {
    @Autowired
    private 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:389
    base: dc=testldap,dc=com
    username: cn=admin,dc=testldap,dc=com
    password: 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;
    @Bean
    public LdapContextSource contextSource() {
        LdapContextSource contextSource = new LdapContextSource();
        Map<String, Object> config = new HashMap();
        contextSource.setUrl(url);
        contextSource.setBase(base);
        contextSource.setUserDn(username);// 例:管理员DN
        contextSource.setPassword(password);// 例:管理员密码
        //  解决乱码
        config.put("java.naming.ldap.attributes.binary", "objectGUID");
        // 启动时不立即初始化(lazy connection initializing),直到第一次LDAP操作
        contextSource.setPooled(true);
        // 调用afterPropertiesSet方法是必须的,它会处理配置并创建初始连接
        contextSource.setBaseEnvironmentProperties(config);
        return contextSource;
    }
    @Bean
    public 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 {
    @Id
    private 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.coloradmin.cn/o/1696284.html

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

相关文章

springboot社区助老志愿服务系统-计算机毕业设计源码96682

摘要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在图书馆管理的要求下&#xff0c;开发一款整体式结构的社区助老志愿服务…

洗地机十大品牌排名:2024十大值得入手的洗地机盘点

随着生活水平的提高&#xff0c;智能清洁家电已经成为日常生活中的必需品。洗地机之所以在家庭清洁中大受欢迎&#xff0c;主要是因为它的多功能特性。传统的清洁方式通常需要扫帚、拖把和吸尘器分别进行操作&#xff0c;而洗地机将这些功能集成在一个设备中&#xff0c;使清洁…

MHDDoS:一个包含了56种技术的DDoS测试工具

关于MHDDoS MHDDoS是一款功能强大的DDoS服务器/站点安全测试工具&#xff0c;该工具包含56种技术&#xff0c;可以帮助广大研究人员对自己的服务器或网站执行DDoS安全测试。 工具技术 Layer7 GET | GET 泛洪 POST | POST 泛洪 OVH | 绕过OVH RHEX | 随机HEX STOMP | 绕过chk_…

Mysql-根据字段名查询字段在哪些表里

SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAMElabel_name;

【Qt 学习笔记】Qt窗口 | 工具栏 | QToolBar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 工具栏 | QToolBar的使用及说明 文章编号&#xff1a;Qt 学习…

Spring AI实战之二:Chat API基础知识大串讲(重要)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos Spring AI实战全系列链接 Spring AI实战之一&#xff1a;快速体验(OpenAI)Spring AI实战之二&#xff1a;Chat API基础知识大串讲(重要)SpringAIOllama三部曲…

将本地项目上传到 gitee 仓库

1、创建 gitee 仓库 到 gitee 官网&#xff0c;新建仓库 配置新建仓库 完成仓库的创建 项目上传到仓库 上传项目需要安装git git官方下载地址&#xff1a;git下载地址 安装完成&#xff0c;前往本地项目所在文件夹&#xff0c;右击选择 Git Bash Here 刚下载完成需要配置G…

Quartus 联合 ModelSim 仿真 IP 核(RAM)

文章目录 ModelSim 路径设置创建 RAM进行仿真 本文主要介绍如何在包含 IP 核的 Quartus 项目中使用 Modelsim 进行仿真&#xff0c;本文基于 IP 核 RAM: 2-PORT&#xff0c;其他 IP 核类似。 ModelSim 路径设置 点击 Tools->Options 点击 EDA Tool Options&#xff0c;设置…

一张图片中有多个一样的目标物体,分别进行识别定位分割(Python实现)

需求&#xff1a; 一张图片中有多个目标物体&#xff0c;将多个目标物体进行识别分割定位 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img_path r"test3.png" img cv2.imread(img…

Camunda BPM主要组件

Camunda BPM是使用java开发的,核心流程引擎运行在JVM里,纯java库,不依赖其他库或者底层操作系统。可以完美地与其他java框架融合,比如Spring。除了核心流程引擎外,还提供了一系列的管理,操作和监控工具。 1,工作流引擎 既适用于服务或者微服务编排,也适用于人工任务管…

FuTalk设计周刊-Vol.052

#AI漫谈 热点捕手 1.ChatGPT 大更新&#xff01;GPT-4 开始又变聪明了 OpenAI 官方宣布&#xff0c;新版 GPT-4 Turbo 今天开始向所有付费 ChatGPT 用户开放。 链接https://www.pconline.com.cn/focus/1733/17330089.html 2.刷爆多模态任务榜单&#xff01;贾佳亚团队Mini-G…

决策控制类软件项目的团队配置

决策控制类软件项目的团队配置怎样才是最合适的&#xff1f;目的就是实现高效的项目协作以及为企业降本增效。软件项目的主要费用来源是研发人员的开支以及差旅费用。 下面的思维导图从项目与产品的关系、团队架构、项目成员配置、项目可复制性、招聘这几点进行说明如何组织人…

Windows安装并启动Redis服务端(zip包)

一、Redis简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的基于内存的 Key - Value结构的数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;常用于缓存、消息队列、会话存储…

手机相册的照片彻底删除了怎么恢复?删除照片恢复的5种方法

在数字化时代&#xff0c;手机相册里装满了我们的生活点滴和珍贵回忆。然而&#xff0c;一不小心就可能误删那些意义非凡的照片。别担心&#xff0c;今天小编就给大家介绍5种恢复误删照片的方法&#xff0c;让你的回忆不再丢失&#xff01; 方法一&#xff1a;相册App的“最近删…

《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 各种自动化框架都会有脚本录制功能&#xff0c; playwright这么牛叉当然也不例外。很早之前的selenium、Jmeter工具&#xff0c;发展到每种浏览器都有对应的录制插件。今天我们…

ROS2入门21讲__第19讲__Rviz:三维可视化显示平台

目录 前言 Rviz三维可视化平台 Rviz介绍 运行方法 彩色相机仿真与可视化 仿真插件配置 运行仿真环境 图像数据可视化 三维相机仿真与可视化 仿真插件配置 运行仿真环境 点云数据可视化 激光雷达仿真与可视化 仿真插件配置 运行仿真环境 点云数据可视化 Rviz v…

光伏无人机巡检的工作原理是什么?

随着科技的飞速发展&#xff0c;无人机技术已经深入到众多领域&#xff0c;其中光伏电站的巡检工作便是其应用的一个重要方向。光伏无人机巡检&#xff0c;通过搭载各种先进的传感器和设备&#xff0c;对光伏电站进行全面的、高效的、安全的检测&#xff0c;为电站的运维管理提…

win10安装rabbitmq

安装 第一步&#xff1a;下载并安装erlang RabbitMQ服务端代码是使用并发式语言Erlang编写&#xff0c;因此首先需要安装Erlang下载地址&#xff1a;http://www.erlang.org/downloads采用默认安装即可&#xff0c;选择适合的安装路径 添加环境变量 第二步&#xff1a;下载并…

力扣刷题---2206. 将数组划分成相等数对【简单】

题目描述&#x1f357; 给你一个整数数组 nums &#xff0c;它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对&#xff0c;满足&#xff1a; 每个元素 只属于一个 数对。 同一数对中的元素 相等 。 如果可以将 nums 划分成 n 个数对&#xff0c;请你返回 true &#xf…

PgSQL内核机制 - 算子执行统计元组个数

PgSQL内核机制 - 算子执行统计元组个数 我们在执行explain analyze观察执行计划执行情况时&#xff0c;时常通过每个算子实际执行结果来分析SQL的执行&#xff0c;其中有一项“rows XXX”表示执行的行数&#xff08;这里姑且先认为是执行的真实行数&#xff09;。但有些场景下…