如何注銷網(wǎng)站備案號數(shù)據(jù)分析培訓(xùn)班
文章目錄
- 一、概述:
- 1、簡介
- 2、LDAP目錄
- 2.1 基于國家的目錄排列
- 2.2 基于域名的排列
- 3、為什么使用LDAP
- 二、Java連接代碼
- 1、連接代碼
- 2、LDAP登錄的三種方式
- 三、客戶端下載
- 四、參考地址
- 五、官方地址
- 1、LDAP地址:
- 2、LDAP Account Manager 地址:
一、概述:
1、簡介
LDAP(Lightweight Directory Access Protocol)
LDAP
代表輕型目錄訪問協(xié)議(Lightweight Directory Access Protocol)。顧名思義,它是用于訪問目錄服務(wù)的輕量級協(xié)議,特別是基于X.500協(xié)議的目錄服務(wù)。LDAP運(yùn)行于TCP/IP連接上或其他面向傳輸服務(wù)的連接上。LDAP是IETF標(biāo)準(zhǔn)跟蹤協(xié)議,并且在“Lightweight Directory Access Protocol (LDAP) Technical Specification Road Map”
RFC4510中進(jìn)行了指定。
目錄是專門為搜索和瀏覽而設(shè)計的專用數(shù)據(jù)庫,支持基本的查找和更新功能。
? 提供目錄服務(wù)的方式有很多。不同的方法允許將不同類型的信息存儲在目錄中,對如何引用,查詢和更新該信息,如何防止未經(jīng)授權(quán)的訪問等提出不同的要求(這些由LDAP定義)。一些目錄服務(wù)是本地的,提供本地服務(wù);一些目錄服務(wù)是全球性的,向更廣泛的環(huán)境(例如,整個Internet)提供服務(wù)。全局服務(wù)通常是分布式的,這意味著它們包含的數(shù)據(jù)分布在許多機(jī)器上,所有這些機(jī)器協(xié)作以提供目錄服務(wù)。通常,全局服務(wù)定義統(tǒng)一的名稱空間,無論在何處訪問,都可以提供相同的數(shù)據(jù)視圖。
2、LDAP目錄
2.1 基于國家的目錄排列
在LDAP中,目錄條目以樹狀分層結(jié)構(gòu)排列。傳統(tǒng)上,此結(jié)構(gòu)反映了地理和組織邊界。代表國家的條目顯示在樹的頂部。它們下面是代表省和國家機(jī)構(gòu)的條目。再下一層可能是代表組織單位,人員,打印機(jī),文檔或您想到的幾乎所有其他內(nèi)容的條目。

2.2 基于域名的排列
該樹還可以基于網(wǎng)絡(luò)域名進(jìn)行排列。這種命名方法變得越來越流行,因為它允許使用DNS定位目錄服務(wù)。
基于域名的LDAP目錄樹示例:

3、為什么使用LDAP
隨著公司內(nèi)部各種開源平臺越來越多(例如:gitlab、Jenkins、Yapi等等),賬號維護(hù)變成一個繁瑣麻煩的事情,急需有一個統(tǒng)一的賬號維護(hù)平臺,一個人只需一個賬號,在公司內(nèi)部平臺通用,而大多數(shù)開源平臺都支持LDAP;因此只要搭建好LDAP服務(wù),并跟釘釘之類的平臺實(shí)現(xiàn)賬號同步,即可實(shí)現(xiàn)統(tǒng)一賬號管理;
二、Java連接代碼
1、連接代碼
現(xiàn)在可以從Java程序訪問LDAP。 向您展示如何執(zhí)行此操作的最佳方法是通過示例程序。 該程序?qū)?zhí)行以下任務(wù):
- 創(chuàng)建一個新的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登錄的三種方式
搜索中關(guān)于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 {/*** 獲取默認(rèn)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");//連接超時設(shè)置為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/87780021

四、參考地址
1、LDAP介紹及使用
https://blog.csdn.net/suo082407128/article/details/115294490
2、Java到LDAP教程(包括如何安裝LDAP服務(wù)器/客戶端)
https://blog.csdn.net/dnc8371/article/details/106703325
3、JAVA中使用LDAP登錄的三種方式
https://www.cnblogs.com/huanghongbo/p/12053272.html
五、官方地址
1、LDAP地址:
OpenLDAP(LDAP開源實(shí)現(xiàn))官方文檔庫: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版的管理工具;
官網(wǎng):https://www.ldap-account-manager.org/lamcms/
官網(wǎng)Demo:https://www.ldap-account-manager.org/lam/templates/login.php,密碼lam
官方docker鏡像:https://registry.hub.docker.com/r/ldapaccountmanager/lam