文章目录

  • 一、简介:
    • 2、目录简介
      • 2.1 基于国家的目录排列
      • 2.2 基于域名的排列
    • 3、为什么使用LDAP
  • 二、Java连接代码
    • 2、JAVA中使用LDAP登录的三种方式
  • 三、客户端连接
  • 四、参考地址
  • 五、官方地址
    • 1、LDAP地址:
    • 2、LDAP Account Manager 地址:

一、简介:

LDAP(Lightweight Directory Access Protocol)
LDAP代表轻型目录访问协议(Lightweight Directory Access Protocol)。顾名思义,它是用于访问目录服务的轻量级协议,特别是基于X.500协议的目录服务。LDAP运行于TCP/IP连接上或其他面向传输服务的连接上。LDAP是IETF标准跟踪协议,并且在“Lightweight Directory Access Protocol (LDAP) Technical Specification Road Map” RFC4510中进行了指定。

目录是专门为搜索浏览而设计的专用数据库,支持基本的查找和更新功能。

​ 提供目录服务的方式有很多。不同的方法允许将不同类型的信息存储在目录中,对如何引用,查询和更新该信息,如何防止未经授权的访问等提出不同的要求(这些由LDAP定义)。一些目录服务是本地的,提供本地服务;一些目录服务是全球性的,向更广泛的环境(例如,整个Internet)提供服务。全局服务通常是分布式的,这意味着它们包含的数据分布在许多机器上,所有这些机器协作以提供目录服务。通常,全局服务定义统一的名称空间,无论在何处访问,都可以提供相同的数据视图。

2、目录简介

2.1 基于国家的目录排列

在LDAP中,目录条目以树状分层结构排列。传统上,此结构反映了地理和组织边界。代表国家的条目显示在树的顶部。它们下面是代表省和国家机构的条目。再下一层可能是代表组织单位,人员,打印机,文档或您想到的几乎所有其他内容的条目

2.2 基于域名的排列

该树还可以基于网络域名进行排列。这种命名方法变得越来越流行,因为它允许使用DNS定位目录服务。

基于域名的LDAP目录树示例:

3、为什么使用LDAP

随着公司内部各种开源平台越来越多(例如:gitlab、Jenkins、Yapi等等),账号维护变成一个繁琐麻烦的事情,急需有一个统一的账号维护平台,一个人只需一个账号,在公司内部平台通用,而大多数开源平台都支持LDAP;因此只要搭建好LDAP服务,并跟钉钉之类的平台实现账号同步,即可实现统一账号管理;

二、Java连接代码

现在可以从Java程序访问LDAP。 向您展示如何执行此操作的最佳方法是通过示例程序。 该程序将执行以下任务:

  • 创建一个新的LDAP对象
  • 查看LDAP对象
  • 将新属性添加到LDAP对象
  • 修改LDAP对象上的属性
  • 删除LDAP对象上的属性
  • 删除LDAP对象
package test;import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.*;public class LDAPTest {public void run() {try {DirContext context = getContext();String name = "employeeNumber=00001,ou=system";createLDAPObject(context, name);createAttribute(context, name, "displayName", "JOBS");viewAttribute(context, name, "displayName");updateAttribute(context, name, "displayName", "STEVE");viewAttribute(context, name, "displayName");removeAttribute(context, name, "displayName");removeLDAPObject(context, name);} catch (NamingException e) {e.printStackTrace();}}private void removeLDAPObject(DirContext context, String name) throws NamingException {context.destroySubcontext(name);}private void createLDAPObject(DirContext context, String name) throws NamingException {Attributes attributes = new BasicAttributes();Attribute attribute = new BasicAttribute("objectClass");attribute.add("inetOrgPerson");attributes.put(attribute);Attribute sn = new BasicAttribute("sn");sn.add("Steve");attributes.put(sn);Attribute cn = new BasicAttribute("cn");cn.add("Jobs");attributes.put(cn);attributes.put("telephoneNumber", "123456");context.createSubcontext(name, attributes);}private void removeAttribute(DirContext context, String name, String attrName) throws NamingException {Attribute attribute = new BasicAttribute(attrName);ModificationItem[] item = new ModificationItem[1];item[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attribute);context.modifyAttributes(name, item);}private void createAttribute(DirContext context, String name, String attrName, Object attrValue) throws NamingException {Attribute attribute = new BasicAttribute(attrName, attrValue);ModificationItem[] item = new ModificationItem[1];item[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attribute);context.modifyAttributes(name, item);}private void updateAttribute(DirContext context, String name, String attrName, Object attrValue) throws NamingException {Attribute attribute = new BasicAttribute(attrName, attrValue);ModificationItem[] item = new ModificationItem[1];item[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attribute);context.modifyAttributes(name, item);}private void viewAttribute(DirContext context, String name, String attrName) throws NamingException {Attributes attrs = context.getAttributes(name);System.out.println(attrName + ":" + attrs.get(attrName).get());}private DirContext getContext() throws NamingException {Properties properties = new Properties();properties.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");properties.put(Context.PROVIDER_URL, "ldap://localhost:10389");return new InitialDirContext(properties);}public static void main(String[] args) {new LDAPTest().run();}
}

2、JAVA中使用LDAP登录的三种方式

搜索中关于java 登录ldap,大部分会采用 cn=xxx,ou=xxx,dc=xxx的方式,此处的cn是用户的Display Name,而不是account,而且如果ou有多层,比如我们的OU就会超过三层。

那最好是通过用户的account直接登录

package com.lydms.demospringtransaction.controller;//package test;import javax.naming.AuthenticationException;
import javax.naming.CommunicationException;
import javax.naming.Context;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.Hashtable;public class LDAPTest {/*** 获取默认LDAP连接     * Exception 则登录失败,ctx不为空则登录成功* @return void*/public static LdapContext getLDAPConnection() throws AuthenticationException, CommunicationException,Exception {LdapContext ctx = null;//LDAP 连接地址 ldap://IP:PORT (default port 389)String LDAP_URL = "";//LDAP SSL连接地址 ldaps://IP:PORT (default port 636)//(这个用起来比较麻烦,目前知道管理员改密码必须使用SSL)String LDAP_SSL_URL = "";//用户名String userAccount = "";//管理员密码String userPassword = "";//      方式1
//      基于姓名(cn),此cn为Display Name,部门有同名就麻烦了userAccount = "cn=xxx,OU=xxx,DC=xxx,DC=com";//        方式2
//        基于Account User Logon name:
//      userAccount = "xxx@domain.xxx";//        方式3
//        基于Account User Logon name(pre-windows 2000):
//        userAccount = "domain\\xxx"//      基于登录名(uid (User ID)与 unix 的 uid 完全不同)(请注意objectSID,此处尝试失败)
//      uid=abc123, ou=xxxx, dc=xxxx, dc=comuserPassword = "xxxxx";Hashtable<String,String> HashEnv = new Hashtable<String,String>();HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别(none,simple,strong)HashEnv.put(Context.SECURITY_PRINCIPAL, userAccount); //AD的用户名HashEnv.put(Context.SECURITY_CREDENTIALS, userPassword); //AD的密码HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");//连接超时设置为3秒HashEnv.put(Context.PROVIDER_URL, LDAP_URL);ctx =  new InitialLdapContext(HashEnv, null);//new InitialDirContext(HashEnv);// 初始化上下文return ctx;}
}

三、客户端连接

LdapBrowser客户端:

https://download.csdn.net/download/weixin_44624117/85629116

四、参考地址

1、LDAP介绍及使用

https://blog.csdn.net/suo082407128/article/details/115294490

2、Java到LDAP教程(包括如何安装LDAP服务器/客户端)

https://blog.csdn.net/dnc8371/article/details/106703325

3、JAVA中使用LDAP登录的三种方式

https://www.cnblogs.com/huanghongbo/p/12053272.html

五、官方地址

1、LDAP地址:

OpenLDAP(LDAP开源实现)官方文档库:https://www.openldap.org/doc/
LDAP管理员指南:https://www.openldap.org/doc/admin24/index.html
非OpenLDAP官方Docker镜像:https://github.com/osixia/docker-openldap

2、LDAP Account Manager 地址:

OpenLDAP安装完成后,用命令操作不方便,需要一个可视化管理工具随时访问,LDAP Account Manager为web版的管理工具;
官网:https://www.ldap-account-manager.org/lamcms/
官网Demo:https://www.ldap-account-manager.org/lam/templates/login.php,密码lam
官方docker镜像:https://registry.hub.docker.com/r/ldapaccountmanager/lam

LDAP简介及Java、客户端连接相关推荐

  1. 虚拟机安装fastdfs之后,java客户端连接超时问题,查看开放端口

    虚拟机安装fastdfs之后,java客户端连接超时问题 java.net.SocketTimeoutException: connect timed out 报错信息显示是连接超时,因为fastdf ...

  2. 005,使用Java客户端连接RabbitMQ,构造我们的第一个Publish和Consumer应用

    2019独角兽企业重金招聘Python工程师标准>>> 官网地址:http://www.rabbitmq.com/documentation.html    如下图: 在客户端连接服 ...

  3. hadoop fs命令无法使用_Hadoop从入门到入土(三)HDFS集群简单维护及JAVA客户端连接HDFS...

    集群简单维护 查看日志 上篇我们搭建了集群,并且完成了hdfs的搭建,但在我的linux02和linux03上,发现一个问题,我启动了datanode之后,开始进程还在,一会就自己消失了,这是为什么呢 ...

  4. EMQX(五)—JAVA客户端连接操作EMQX服务

    前言 EMQX提供了很多客户端SDK,如java,js,C++等.除此之外,只要满足MQTT协议的客户端,都可以对EMQX主题进行连接.下面我们讲解java的SDK客户端. 一.Eclipse Pah ...

  5. 【Redis】使用 Java 客户端连接 Redis

    一.三种客户端比较 Jedis : 学习成本低,以 Redis 命令作为方法名称,但是其线程不安全 lettuce:基于 Netty 实现,支持同步.异步.响应式编程(SpringBoot),并且线程 ...

  6. Neo4j的两种方式访问(嵌入式访问、服务器模式访问)-- java客户端连接和SpringBoot整合Neo4j

    一.Neo4j数据库访问 1.Neo4j数据库访问 嵌入式数据库 服务器模式(通过REST的访问) 它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选 ...

  7. java客户端连接请求发不出去_java – Spring:客户端发送的请求在语法上不正确()...

    嗨,我在重定向期间收到下一个错误: The request sent by the client was syntactically incorrect 浏览器显示的URL是:localhost:80 ...

  8. android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...

    我在我的电脑上执行java服务器并让我的android设备连接到它.我可以连接它,但一旦连接就会断开连接.我确信在android方面我需要做一些事情,但我很少迷失它.我有互联网许可,所以很好.Andr ...

  9. java学习(166):socket服务端和客户端连接

    socket服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;//socket服 ...

  10. java实现代理服务器,接收客户端连接,发送到对应服务器

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现代理服务器,接收客户端连接,发送到对应服务器 package com.lp.app.webserver;import java.net ...

最新文章

  1. cpu风扇声音大_笔记本电脑风扇声音大怎么办
  2. 在某些输入上删除IE10的“清除字段”X按钮?
  3. var s=+newDate();
  4. Discuz常见小问题-如何快速清除帖子
  5. 2-4 zookeeper配置文件介绍,运行zk
  6. 【VS开发】C++线程安全
  7. iOS使用自定义字体(添加字体包)
  8. 求C n m(从n个数中选m个数,有多少种组合?问题)暴力—递归——回归数学公式,三种方法,层层优化!
  9. Docker生态技术链
  10. OptionRoom将在Bounce授权拍卖平台进行Polkadot IDO
  11. dg修改归档目录 oracle_OracleDG主库丢失归档增量同步
  12. 2019年微信养号攻略
  13. Windows xp 驱动EPSON MT532打印小票始末
  14. Google 工作十年后,我选择离开!
  15. 常用cmd操作Redis的命令
  16. 第八章 机器人语音交互 课后作业
  17. pyton random
  18. 对于rh v5系列服务器,华为rh2288v5服务器重定向问题引起pxe报错
  19. C语言+EasyX实现数字雨
  20. SQL注入与ASP木马上传

热门文章

  1. 定义函数,实现折半查找算法
  2. Spring Cache key生成策略, 不要想当然认为是全类名+方法+参数
  3. 终端模拟器怎么用android命令大全,终端模拟器命令大全apk下载-终端模拟器刷入recovery手机版下载V1.0.70安卓最新版-西西软件下载...
  4. 尚硅谷周阳学习微服务《二》
  5. android 强制卸载app,怎么强制删除安卓手机自带软件(三招就能卸载干净)
  6. 关于把数据库放在阿里云上,实现共享
  7. 解析MNIST数据集
  8. Message: session not created: This version of ChromeDriver only supports Chrome version XX
  9. LOJ#2155. 「POI2011 R1」同谋者 Conspiracy
  10. 理解shallow heap 和 retained heap