springboot集成Ldap

这篇具有很好参考价值的文章主要介绍了springboot集成Ldap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是Ldap
轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。
二、为什么需要Ldap
这里举个例子,一个公司内部有很多系统,每个系统都有独立的用户名和密码。密码太多,有时候想不起来哪个密码对应的是哪个系统。后续如果又新增一个项目,还要在开发和维护一套用户和密码。如何才能系统整合,以此做到账号的打通,使多套系统共用一个用户名和密码。如果要求不高的话Ldap就能很好的满足要求,如果要求比较高的话可以开发一个统一门户管理平台(统一门户平台不在本次讨论范围)。
三、Ldap介绍
在 LDAP 里, 一切都是等级化的,或者称之为层级化(hiearchical)。
一棵树有树干,树枝和树叶;树叶长在树枝上,树枝依附于树干。这就是一个简单的层级结构。LDAP 的结构同一棵树类似。假设 LDAP 里存储的是公司的信息,那么可以把公司(company)本身理解为树干,公司里面的各个部门,比如组(group),理解为树干,把用户(user)理解为树叶。这样的结构称之为目录信息树(DIrectory Information Tree,DIT)。

CN, OU, DC 都是 LDAP 连接服务器的端字符串中的区别名称(DN, distinguished name)
LDAP连接服务器的连接字串格式为:ldap://servername/DN
其中DN有三个属性,分别是CN,OU,DC
LDAP是一种通讯协议,如同HTTP是一种协议一样的!
在 LDAP 目录中,
· DC (Domain Component)
· CN (Common Name)
· OU (Organizational Unit)
LDAP 目录类似于文件系统目录。
下列目录:
DC=Remeber,DC=Da,DC=microsoft,DC=com
如果我们类比文件系统的话,可被看作如下文件路径:
Com\Microsoft\Da\Remeber
例如:CN=testsan,OU=developer,DC=domainname,DC=com
在上面的代码中 cn=testsan可能代表一个用户名,ou=developer 代表一个 active directory 中的组织单位。这句话的含义可能就是说明 test 这个对象处在domainname.com 域的 developer 组织单元中。

四、Ldap基本模型
每一个系统、协议都会有属于自己的模型,LDAP也不例外,在了解LDAP的基本模型之前我们需要先了解几个LDAP的目录树概念:
(一)目录树概念

  1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
  3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
  4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。
    (二)DC、UID、OU、CN、SN、DN、RDN

关键字 英文全称 含义
dc Domain Component 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
Uid User Id 用户ID songtao.xu(一条记录的ID
ou Organization Unit 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
cn Common Name 公共名称,如“Thomas Johansson”(一条记录的名称)
dn Distinguished Name “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
rdn Relative dn 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”
sn Surname 姓,如“许”
五、集成过程
1、添加依赖

org.springframework.boot
spring-boot-starter-data-ldap

1、在application.properties中添加如下配置
ldap:

服务地址 生产环境

urls: xxxx
base: OU=组织机构,DC=xxxx,DC=ad
username: xxxx
password: xxxx
2、通过如上两步,我们已经完成了springboot集成ldap 。
3、我们建三个方法,方法一:获得所有的域用户,方法二:获得所有的部门,方法三:登录验证
package com.ldap.demo.service.impl;

import static org.springframework.ldap.query.LdapQueryBuilder.query;

import java.util.List;

import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.support.LdapUtils;
import org.springframework.stereotype.Service;

import com.ldap.demo.service.LdapService;
import com.ldap.demo.service.entity.LdapDept;
import com.ldap.demo.service.entity.Ldapuser;

@Service
public class LdapServiceImpl implements LdapService {
@Autowired
private LdapTemplate ldapTemplate;

/**
 * 获得域用户
 */
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Ldapuser> getPersonList() {
    //下面也可以使用filter查询方式,filter 为(&(objectClass=user)(!(objectClass=computer))
    return ldapTemplate.search(query().where("objectclass").is("user").and("objectclass").not().is("computer"),
            new AttributesMapper() {
                @Override
                public Ldapuser mapFromAttributes(Attributes attr) throws NamingException {
                    //如果不知道ldap中有哪些属性,可以使用下面这种方式打印
                    // NamingEnumeration<? extends Attribute> att = attr.getAll();
                    //while (att.hasMore()) {
                    //  Attribute a = att.next();
                    // System.out.println(a.getID());
                    //}
                    Ldapuser person = new Ldapuser();
                    String distingugihedName = (String) attr.get("distinguishedName").get();
                    person.setUserName((String) attr.get("sAMAccountName").get());
                    person.setRealName((String) attr.get("cn").get());
                    String departmentName = StringUtils.substringAfter(distingugihedName.split(",")[1], "OU=");
                    person.setUnitName(departmentName);
                    if (attr.get("description") != null) {
                        person.setDescription((String) attr.get("description").get());
                    }
                    if (attr.get("mobile") != null) {
                        person.setPhone((String) attr.get("mobile").get());
                    }
                    if (attr.get("telephoneNumber") != null) {
                        person.setTelephone((String) attr.get("telephoneNumber").get());
                    }
                    if (attr.get("userPrincipalName") != null) {
                        person.setEmail((String) attr.get("userPrincipalName").get());
                    }
                    return person;
                }
            });
}

/**
 * 获得部门
 */
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<LdapDept> getDeptList() {
    return ldapTemplate.search(
            下面也可以使用filter查询方式,filter 为(|(objectclass=organizationalunit)(objectclass=organization))
            query().where("objectclass").is("organizationalunit").or("objectclass").is("organization"),
            new AttributesMapper() {
                @Override
                public LdapDept mapFromAttributes(Attributes attr) throws NamingException {
                    //如果不知道ldap中有哪些属性,可以使用下面这种方式打印
                    // NamingEnumeration<? extends Attribute> att = attr.getAll();
                    //while (att.hasMore()) {
                    //  Attribute a = att.next();
                    // System.out.println(a.getID());
                    //}
                    LdapDept dept = new LdapDept();
                    dept.setDeptId(attr.get("ou").toString().split(":")[1].trim());
                    if (attr.get("description") != null) {
                        dept.setDeptName(attr.get("description").toString().split(":")[1].trim());
                    }
                    return dept;
                }
            });
}

/**  
 * 根据用户名密码验证  
 * @param userCn   用户名 
 * @param pwd  密码  
 * @return  
 */
@SuppressWarnings("unchecked")
@Override
public boolean authenticate(String userCn, String pwd) {
    DirContext ctx = null;
    System.out.println(userCn + ":" + pwd);
    try {
        //调用ldap 的 authenticate方法检验
        String filter = "(&(objectclass=user)(!(objectClass=computer))(sAMAccountName=" + userCn + "))";
        boolean authenticate = ldapTemplate.authenticate("", filter, pwd);
        return authenticate;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        LdapUtils.closeContext(ctx);
    }

}

}
Ldapuser代码如下:
package com.ldap.demo.service.entity;

import lombok.Data;

@Data
public class Ldapuser {
/**
* 用户名
/
private String userName;
/
*
* 邮箱
/
private String email;
/
*
* 手机号
/
private String phone;
/
*
* 座机号
/
private String telephone;
/
*
* 真实姓名
/
private String realName;
/
*
* 部门
/
private String unitName;
/
*
* 描述
*/
private String description;

}
LdapDept代码如下
package com.ldap.demo.service.entity;

import lombok.Data;

@Data
public class LdapDept {
/**
* 部门代码
/
private String deptId;
/
*
* 部门名称
*/
private String deptName;

}文章来源地址https://www.toymoban.com/news/detail-627179.html

到了这里,关于springboot集成Ldap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微服务】Spring Boot集成ELK实用案例

    推荐一款我一直在用国内很火的 AI网站 ,包含 GPT3.5/4.0、文心一言、通义千问、智谱AI等多个AI模型 ,支持PC、APP、VScode插件同步使用,点击链接跳转-ChatGPT4.0中文版 在现代软件开发中,微服务架构已成为一种流行趋势。随之而来的挑战之一是如何有效地管理和分析分布在各个

    2024年02月20日
    浏览(35)
  • Spring Boot进阶(48):【实战教程】SpringBoot集成WebSocket轻松实现实时消息推送

            WebSocket是一种新型的通信协议,它可以在客户端与服务器端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。在SpringBoot应用中,集成WebSocket可以方便地实现实时通信功能,如即时聊天、实时数据传输等。         本文将介绍如何在Sprin

    2024年02月09日
    浏览(57)
  • 在Spring Boot微服务集成Jedis操作Redis

    记录 :406 场景 :在Spring Boot微服务集成Jedis操作Redis的缓存和队列。 版本 :JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。 1.微服务中配置 Redis信息 1.1在application.yml中Jedis配置信息 1.2使用 ConfigurationProperties加载Jedis配置 Spring Boot微服务在启动时,自动注解机制会读取application.yml的

    2023年04月15日
    浏览(56)
  • Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

            随着大数据时代的到来,数据存储和处理变得越来越重要。而MongoDB作为一种非关系型数据库,具有高效的数据存储和处理能力,被越来越多地应用于各种领域。尤其在Web应用开发中,SpringBoot框架已经成为了主流选择之一。在这篇文章中,我们将探讨如何将MongoD

    2024年02月17日
    浏览(45)
  • spring boot +springboot集成es7.9.1+canal同步到es

    未经许可,请勿转载。 其实大部分的代码是来源于 参考资料来源 的 主要代码实现 ,我只是在他的基础上增加自定义注解,自定义分词器等。需要看详细源码的可以去看 主要代码实现 ,结合我的来使用。 有人会问为什么需要自定义注解,因为elasticsearch7.6 索引将去除type 没

    2023年04月11日
    浏览(82)
  • Spring Boot集成阿里云视频点播服务的过程记录

    在对接阿里云视频点播服务时,踩了不少的坑。特此记录阿里云视频点播服务的相关使用。 同时使用Spring Boot集成阿里云视频点播服务,对接其上传SDK、服务端SDK、播放器SDK,最终完成如下Demo演示。 视频点播(ApsaraVideo VoD,简称VoD)是集视频采集、编辑、上传、媒体资源管

    2023年04月21日
    浏览(36)
  • 在Spring Boot微服务集成JedisCluster操作Redis集群

    记录 :448 场景 :在Spring Boot微服务使用JedisCluster操作Redis集群的缓存和队列等数据类型。 版本 :JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。 1.微服务中 配置Redis信息 1.1在pom.xml添加依赖 pom.xml文件: 解析:在Spring Boot中默认集成jedis,使用无需加版本号,本例版本3.7.1是Spring 

    2024年02月09日
    浏览(46)
  • 在Spring Boot微服务集成spring-kafka操作Kafka集群

    记录 :461 场景 :在Spring Boot微服务集成spring-kafka-2.8.2操作Kafka集群。使用KafkaTemplate操作Kafka集群的生产者Producer。使用@KafkaListener操作Kafka集群的消费者Consumer。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。 Kafka集群安装 :https://blog.csdn.net/zhangbeizhen18/article/details

    2024年02月10日
    浏览(50)
  • Spring Boot进阶(49):SpringBoot之集成WebSocket实现前后端通信 | 超级详细,建议收藏

            在上一期,我对WebSocket进行了基础及理论知识普及学习,WebSocket是一种基于TCP协议实现的全双工通信协议,使用它可以实现实时通信,不必担心HTTP协议的短连接问题。Spring Boot作为一款微服务框架,也提供了轻量级的WebSocket集成支持,本文将介绍如何在Spring Boot项

    2024年02月14日
    浏览(40)
  • 【Spring Boot】SpringBoot 2.6.6 集成 SpringDoc 1.6.9 生成swagger接口文档

    之前常用的SpringFox在2020年停止更新了,新项目集成SpringFox出来一堆问题,所以打算使用更活跃的SpringDoc,这里简单介绍一下我这边SpringBoot2.6.6集成SpringDoc1.6.9的demo。 官网链接 maven为例: 代码如下(示例): 默认路径: UI界面 http://localhost:9527/swagger-ui/index.html json界面 http:/

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包