一、概述:
1、简介
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、LDAP目录
2.1 基于国家的目录排列
在LDAP中,目录条目以树状分层结构排列。传统上,此结构反映了地理和组织边界。代表国家的条目显示在树的顶部。它们下面是代表省和国家机构的条目。再下一层可能是代表组织单位,人员,打印机,文档或您想到的几乎所有其他内容的条目。
2.2 基于域名的排列
该树还可以基于网络域名进行排列。这种命名方法变得越来越流行,因为它允许使用DNS定位目录服务。
基于域名的LDAP目录树示例:
3、为什么使用LDAP
随着公司内部各种开源平台越来越多(例如:gitlab、Jenkins、Yapi等等),账号维护变成一个繁琐麻烦的事情,急需有一个统一的账号维护平台,一个人只需一个账号,在公司内部平台通用,而大多数开源平台都支持LDAP;因此只要搭建好LDAP服务,并跟钉钉之类的平台实现账号同步,即可实现统一账号管理;
二、Java连接代码
1、连接代码
现在可以从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、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客户端:
四、参考地址
1、LDAP介绍及使用
2、Java到LDAP教程(包括如何安装LDAP服务器/客户端)
3、JAVA中使用LDAP登录的三种方式
五、官方地址
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