您好,登錄后才能下訂單哦!
這篇文章主要講解了“LDAP舉例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“LDAP舉例分析”吧!
首先要先理解什么是LDAP,當時我看了很多解釋,也是云里霧里,弄不清楚。在這里給大家稍微捋一捋。 首先LDAP是一種通訊協議,LDAP支持TCP/IP。協議就是標準,并且是抽象的。在這套標準下,AD(Active Directory)是微軟出的一套實現。 那AD是什么呢?暫且把它理解成是個數據庫。也有很多人直接把LDAP說成數據庫(可以把LDAP理解成存儲數據的數據庫)。像是其他數據庫一樣,LDAP也是有client端和server端。server端是用來存放資源,client端用來操作增刪改查等操作。 而我們通常說的LDAP是指運行這個數據庫的服務器。 可以簡單理解AD =LDAP服務器+LDAP應用。
那LDAP這種數據庫有什么特殊的呢?
我們知道,像MySQL數據庫,數據都是按記錄一條條記錄存在表中。而LDAP數據庫,是樹結構的,數據存儲在葉子節點上。看看下面的比喻:
假設你要樹上的一個蘋果(一條記錄),你怎么告訴園丁它的位置呢?當然首先要說明是哪一棵樹(dc,相當于MYSQL的DB),然后是從樹根到那個蘋果所經過的所有“分叉”(ou),最后就是這個蘋果的名字(uid,相當于MySQL表主鍵id)。好了!這時我們可以清晰的指明這個蘋果的位置了,就是那棵“歪脖樹”的東邊那個分叉上的靠西邊那個分叉的再靠北邊的分叉上的半紅半綠的……,暈了!你直接爬上去吧!
就這樣就可以描述清楚“樹結構”上的一條記錄了。 說一下LDAP里如何定義一個記錄的位置吧。
樹(dc=ljheee) 分叉(ou=bei,ou=xi,ou= dong) 蘋果(cn=redApple)
好了,redApple的位置出來了: dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee 其中dn標識一條記錄,描述了一條數據的詳細路徑。 咦!有人疑問,為什么ou會有多個值?你想想,從樹根到達蘋果的位置,可能要經過好幾個樹杈,所有ou可能有多個值。關于dn后面一長串,分別是cn,ou,dc;中間用逗號隔開。
總結一下LDAP樹形數據庫如下: dn :一條記錄的詳細位置 dc :一條記錄所屬區域 (哪一顆樹) ou :一條記錄所屬組織 (哪一個分支) cn/uid:一條記錄的名字/ID (哪一個蘋果名字) LDAP目錄樹的最頂部就是根,也就是所謂的“基準DN"。
為什么要用LDAP目錄樹來存儲數據,用MySQL不行嗎,為什么非要搞出一個樹形的數據庫呢? 這是因為用樹形結構存儲數據,查詢效率更高(具體為什么,可以看一下關系型數據庫索引的實現原理——B樹/B+樹)。在某些特定的場景下,使用樹形數據庫更理想。比如:需要儲存大量的數據,而且數據不是經常更改,需要很快速的查找。 把它與傳統的關系型數據庫相比,LDAP除了快速查找的特點,它還有很多的運用場景,比如域驗證等。
我們可以用JDBC操作MySQL數據庫,進行對數據的增刪改查。同樣,LDAP樹形數據庫,也可以通過JDBC方式;除此之外,還可以用JNDI的方式(更推薦),因為樹形可以看做是目錄,樹結構的枝杈相當于目錄的層級。
還有LDAP數據庫展示數據也是樹形的,可以把ApacheDirectoryStudio看做是連接數據庫服務器的界面化的client,相當于Navicat、WorkBench。新建連接,連接數據庫服務器的操作類似。
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為申請的對接賬戶 String password = "PASSW"; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");//設置連接LDAP的實現工廠 env.put(Context.PROVIDER_URL, "ldap://172.26.39.77:389/" + rootFilter);// 指定LDAP服務器的主機名和端口號 env.put(Context.SECURITY_AUTHENTICATION, "simple");//給環境提供認證方法,有SIMPLE、SSL/TLS和SASL env.put(Context.SECURITY_PRINCIPAL, username);//指定進入的目錄識別名DN env.put(Context.SECURITY_CREDENTIALS, password); //進入的目錄密碼 env.put("filter",filter); DirContext ctx = null; try { // 得到初始目錄環境的一個引用 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");//獲取到一個人員, NamingEnumeration bindings = ctx.listBindings("ou=Internal,ou=People");//列舉 內部人員 while (bindings.hasMore()) { Binding bd = (Binding)bindings.next(); System.out.println(bd.getName() + ": " + bd.getObject()); } /*根據結點的DN來查找它的所有屬性, 然后再從屬性中得到所有的值,注意一個屬性可以有多個值*/ // for (NamingEnumeration ae = attrs.getAll(); ae.hasMore(); ) { // //獲取一個屬性 // 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("認證失敗"); e.printStackTrace(); } catch (Exception e) { System.out.println("認證出錯:"); 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(); }
感謝各位的閱讀,以上就是“LDAP舉例分析”的內容了,經過本文的學習后,相信大家對LDAP舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。