LDAP入门
LDAP入門
- 首先要先理解什么是LDAP,當(dāng)時(shí)我看了很多解釋,也是云里霧里,弄不清楚。在這里給大家稍微捋一捋。
- 首先LDAP是一種通訊協(xié)議,LDAP支持TCP/IP。協(xié)議就是標(biāo)準(zhǔn),并且是抽象的。在這套標(biāo)準(zhǔn)下,AD(Active Directory)是微軟出的一套實(shí)現(xiàn)。
那AD是什么呢?暫且把它理解成是個(gè)數(shù)據(jù)庫(kù)。也有很多人直接把LDAP說(shuō)成數(shù)據(jù)庫(kù)(可以把LDAP理解成存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù))。像是其他數(shù)據(jù)庫(kù)一樣,LDAP也是有client端和server端。server端是用來(lái)存放資源,client端用來(lái)操作增刪改查等操作。 - 而我們通常說(shuō)的LDAP是指運(yùn)行這個(gè)數(shù)據(jù)庫(kù)的服務(wù)器。
- 可以簡(jiǎn)單理解AD =LDAP服務(wù)器+LDAP應(yīng)用。
那LDAP這種數(shù)據(jù)庫(kù)有什么特殊的呢?
- 我們知道,像MySQL數(shù)據(jù)庫(kù),數(shù)據(jù)都是按記錄一條條記錄存在表中。而LDAP數(shù)據(jù)庫(kù),是樹結(jié)構(gòu)的,數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn)上。看看下面的比喻:
假設(shè)你要樹上的一個(gè)蘋果(一條記錄),你怎么告訴園丁它的位置呢?當(dāng)然首先要說(shuō)明是哪一棵樹(dc,相當(dāng)于MYSQL的DB),然后是從樹根到那個(gè)蘋果所經(jīng)過(guò)的所有“分叉”(ou),最后就是這個(gè)蘋果的名字(uid,相當(dāng)于MySQL表主鍵id)。好了!這時(shí)我們可以清晰的指明這個(gè)蘋果的位置了,就是那棵“歪脖樹”的東邊那個(gè)分叉上的靠西邊那個(gè)分叉的再靠北邊的分叉上的半紅半綠的……,暈了!你直接爬上去吧!
就這樣就可以描述清楚“樹結(jié)構(gòu)”上的一條記錄了。
說(shuō)一下LDAP里如何定義一個(gè)記錄的位置吧。
好了,redApple的位置出來(lái)了:
dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee
其中dn標(biāo)識(shí)一條記錄,描述了一條數(shù)據(jù)的詳細(xì)路徑。
咦!有人疑問,為什么ou會(huì)有多個(gè)值?你想想,從樹根到達(dá)蘋果的位置,可能要經(jīng)過(guò)好幾個(gè)樹杈,所有ou可能有多個(gè)值。關(guān)于dn后面一長(zhǎng)串,分別是cn,ou,dc;中間用逗號(hào)隔開。
- 為什么要用LDAP目錄樹來(lái)存儲(chǔ)數(shù)據(jù),用MySQL不行嗎,為什么非要搞出一個(gè)樹形的數(shù)據(jù)庫(kù)呢?
- 這是因?yàn)橛脴湫谓Y(jié)構(gòu)存儲(chǔ)數(shù)據(jù),查詢效率更高(具體為什么,可以看一下關(guān)系型數(shù)據(jù)庫(kù)索引的實(shí)現(xiàn)原理——B樹/B+樹)。在某些特定的場(chǎng)景下,使用樹形數(shù)據(jù)庫(kù)更理想。比如:需要儲(chǔ)存大量的數(shù)據(jù),而且數(shù)據(jù)不是經(jīng)常更改,需要很快速的查找。
- 把它與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)相比,LDAP除了快速查找的特點(diǎn),它還有很多的運(yùn)用場(chǎng)景,比如域驗(yàn)證等。
LDAP編程操作
- 我們可以用JDBC操作MySQL數(shù)據(jù)庫(kù),進(jìn)行對(duì)數(shù)據(jù)的增刪改查。同樣,LDAP樹形數(shù)據(jù)庫(kù),也可以通過(guò)JDBC方式;除此之外,還可以用JNDI的方式(更推薦),因?yàn)闃湫慰梢钥醋鍪悄夸?#xff0c;樹結(jié)構(gòu)的枝杈相當(dāng)于目錄的層級(jí)。
-
還有LDAP數(shù)據(jù)庫(kù)展示數(shù)據(jù)也是樹形的,如下圖是用ApacheDirectoryStudio連接的LDAP服務(wù)器:
?image.png
可以把ApacheDirectoryStudio看做是連接數(shù)據(jù)庫(kù)服務(wù)器的界面化的client,相當(dāng)于Navicat、WorkBench。新建連接,連接數(shù)據(jù)庫(kù)服務(wù)器的操作類似。
ApacheDirectoryStudio下載地址
http://download.csdn.net/download/ljheee/10145654
JNDI連接LDAP服務(wù)器
import org.springframework.beans.factory.annotation.Autowired; import java.util.Hashtable; import javax.naming.*; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; public class LdapJNDI { @Autowired LdapConfiguration ldapConfiguration; public void JNDILookup() { String rootFilter = "o=cvte.com,o=isp"; // String filter = "(&(smart-type=E1)(smart-status=1))"; String filter = "(&(smart-type=E1)(uid=00012047))"; String username = "uid=USER_NAME,ou=Authorization,ou=People,o=cc.com,o=isp";//xxx為申請(qǐng)的對(duì)接賬戶 String password = "PASSW"; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");//設(shè)置連接LDAP的實(shí)現(xiàn)工廠 env.put(Context.PROVIDER_URL, "ldap://172.26.39.77:389/" + rootFilter);// 指定LDAP服務(wù)器的主機(jī)名和端口號(hào) env.put(Context.SECURITY_AUTHENTICATION, "simple");//給環(huán)境提供認(rèn)證方法,有SIMPLE、SSL/TLS和SASL env.put(Context.SECURITY_PRINCIPAL, username);//指定進(jìn)入的目錄識(shí)別名DN env.put(Context.SECURITY_CREDENTIALS, password); //進(jìn)入的目錄密碼 env.put("filter",filter); DirContext ctx = null; try { // 得到初始目錄環(huán)境的一個(gè)引用 ctx = new InitialDirContext(env); //The search base entry 'uid=00012047,ou=Internal,ou=People,o=cvte.com,o=isp' does not exist]; remaining name 'uid=00012047,ou=Internal' // Attributes attrs = ctx.getAttributes("uid=00012047,ou=Internal,ou=People");//獲取到一個(gè)人員, NamingEnumeration bindings = ctx.listBindings("ou=Internal,ou=People");//列舉 內(nèi)部人員 while (bindings.hasMore()) { Binding bd = (Binding)bindings.next(); System.out.println(bd.getName() + ": " + bd.getObject()); } /*根據(jù)結(jié)點(diǎn)的DN來(lái)查找它的所有屬性, 然后再?gòu)膶傩灾械玫剿械闹?注意一個(gè)屬性可以有多個(gè)值*/ // for (NamingEnumeration ae = attrs.getAll(); ae.hasMore(); ) { // //獲取一個(gè)屬性 // Attribute attr = (Attribute) ae.next(); // for (NamingEnumeration ve = attr.getAll(); ve.hasMore(); ) { // System.out.println(String.format("Attribute=%s,Value=%s",attr.getID(),ve.next()) ); // } // } } catch (javax.naming.AuthenticationException e) { System.out.println("認(rèn)證失敗"); e.printStackTrace(); } catch (Exception e) { System.out.println("認(rèn)證出錯(cuò):"); e.printStackTrace(); }finally { if (ctx != null) { try { ctx.close(); } catch (NamingException e) { e.printStackTrace(); } } } } public static void main(String[] args) { LdapJNDI ldapJNDI = new LdapJNDI(); ldapJNDI.JNDILookup(); } }原文地址:https://blog.csdn.net/ssjq123/article/details/81514080
轉(zhuǎn)載于:https://www.cnblogs.com/tily123/p/11038479.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 如何检测支付宝接口中notify_url
- 下一篇: Appium的使用