LDAP入門(mén)

LDAP入門(mén)

  • 首先要先理解什么是LDAP锨侯,當(dāng)時(shí)我看了很多解釋?zhuān)彩窃评镬F里嫩海,弄不清楚。在這里給大家稍微捋一捋囚痴。
  • 首先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ù),是樹(shù)結(jié)構(gòu)的挤聘,數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn)上轰枝。看看下面的比喻:

假設(shè)你要樹(shù)上的一個(gè)蘋(píng)果(一條記錄)组去,你怎么告訴園丁它的位置呢鞍陨?當(dāng)然首先要說(shuō)明是哪一棵樹(shù)(dc,相當(dāng)于MYSQL的DB)从隆,然后是從樹(shù)根到那個(gè)蘋(píng)果所經(jīng)過(guò)的所有“分叉”(ou)诚撵,最后就是這個(gè)蘋(píng)果的名字(uid,相當(dāng)于MySQL表主鍵id)键闺。好了寿烟!這時(shí)我們可以清晰的指明這個(gè)蘋(píng)果的位置了,就是那棵“歪脖樹(shù)”的東邊那個(gè)分叉上的靠西邊那個(gè)分叉的再靠北邊的分叉上的半紅半綠的……辛燥,暈了筛武!你直接爬上去吧!

就這樣就可以描述清楚“樹(shù)結(jié)構(gòu)”上的一條記錄了挎塌。
說(shuō)一下LDAP里如何定義一個(gè)記錄的位置吧畅铭。

樹(shù)(dc=ljheee)
分叉(ou=bei,ou=xi,ou= dong)
蘋(píng)果(cn=redApple)

好了,redApple的位置出來(lái)了:
dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee
其中dn標(biāo)識(shí)一條記錄勃蜘,描述了一條數(shù)據(jù)的詳細(xì)路徑硕噩。
咦!有人疑問(wèn),為什么ou會(huì)有多個(gè)值缭贡?你想想炉擅,從樹(shù)根到達(dá)蘋(píng)果的位置,可能要經(jīng)過(guò)好幾個(gè)樹(shù)杈阳惹,所有ou可能有多個(gè)值谍失。關(guān)于dn后面一長(zhǎng)串,分別是cn莹汤,ou,dc快鱼;中間用逗號(hào)隔開(kāi)。

總結(jié)一下LDAP樹(shù)形數(shù)據(jù)庫(kù)如下:
dn :一條記錄的詳細(xì)位置
dc :一條記錄所屬區(qū)域    (哪一顆樹(shù))
ou :一條記錄所屬組織    (哪一個(gè)分支)
cn/uid:一條記錄的名字/ID   (哪一個(gè)蘋(píng)果名字)
LDAP目錄樹(shù)的最頂部就是根,也就是所謂的“基準(zhǔn)DN"抹竹。
  • 為什么要用LDAP目錄樹(shù)來(lái)存儲(chǔ)數(shù)據(jù)线罕,用MySQL不行嗎,為什么非要搞出一個(gè)樹(shù)形的數(shù)據(jù)庫(kù)呢窃判?
  • 這是因?yàn)橛脴?shù)形結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)钞楼,查詢(xún)效率更高(具體為什么,可以看一下關(guān)系型數(shù)據(jù)庫(kù)索引的實(shí)現(xiàn)原理——B樹(shù)/B+樹(shù))袄琳。在某些特定的場(chǎng)景下询件,使用樹(shù)形數(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ù)形數(shù)據(jù)庫(kù)色建,也可以通過(guò)JDBC方式;除此之外舌缤,還可以用JNDI的方式(更推薦)箕戳,因?yàn)闃?shù)形可以看做是目錄,樹(shù)結(jié)構(gòu)的枝杈相當(dāng)于目錄的層級(jí)国撵。
  • 還有LDAP數(shù)據(jù)庫(kù)展示數(shù)據(jù)也是樹(shù)形的陵吸,如下圖是用ApacheDirectoryStudio連接的LDAP服務(wù)器:


    image.png

可以把ApacheDirectoryStudio看做是連接數(shù)據(jù)庫(kù)服務(wù)器的界面化的client,相當(dāng)于Navicat介牙、WorkBench壮虫。新建連接,連接數(shù)據(jù)庫(kù)服務(wù)器的操作類(lèi)似环础。

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=xxx.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ì)接賬戶(hù)
        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=xxx.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();

    }

}

最后總結(jié)一下LDAP:
1线得、LDAP的結(jié)構(gòu)用樹(shù)來(lái)表示饶唤,而不是用表格。正因?yàn)檫@樣贯钩,就不能用SQL語(yǔ)句了募狂。
2办素、LDAP可以很快地得到查詢(xún)結(jié)果,不過(guò)在寫(xiě)方面祸穷,就慢得多性穿。
3、LDAP提供了靜態(tài)數(shù)據(jù)的快速查詢(xún)方式粱哼。
4季二、Client/server模型檩咱,Server 用于存儲(chǔ)數(shù)據(jù)揭措,Client提供操作目錄信息樹(shù)的工具。
5刻蚯、LDAP是一種開(kāi)放Internet標(biāo)準(zhǔn)绊含,LDAP協(xié)議是跨平臺(tái)的Interent協(xié)議。


Spring LDAP的使用
Spring ldap ODMJava反射實(shí)戰(zhàn) 操作ladp ODM

我的CSDN博客
github地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炊汹,一起剝皮案震驚了整個(gè)濱河市躬充,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讨便,老刑警劉巖充甚,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異霸褒,居然都是意外死亡伴找,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)废菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)技矮,“玉大人,你說(shuō)我怎么就攤上這事殊轴∷ゾ耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵旁理,是天一觀的道長(zhǎng)樊零。 經(jīng)常有香客問(wèn)我,道長(zhǎng)孽文,這世上最難降的妖魔是什么淹接? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮叛溢,結(jié)果婚禮上塑悼,老公的妹妹穿的比我還像新娘。我一直安慰自己楷掉,他們只是感情好厢蒜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布霞势。 她就那樣靜靜地躺著,像睡著了一般斑鸦。 火紅的嫁衣襯著肌膚如雪愕贡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天巷屿,我揣著相機(jī)與錄音固以,去河邊找鬼。 笑死嘱巾,一個(gè)胖子當(dāng)著我的面吹牛憨琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旬昭,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼篙螟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了问拘?” 一聲冷哼從身側(cè)響起遍略,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骤坐,沒(méi)想到半個(gè)月后绪杏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽绍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蕾久,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顶岸。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腔彰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辖佣,到底是詐尸還是另有隱情霹抛,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布卷谈,位于F島的核電站杯拐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏世蔗。R本人自食惡果不足惜端逼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望污淋。 院中可真熱鬧顶滩,春花似錦、人聲如沸寸爆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至仅醇,卻和暖如春冗美,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背析二。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工粉洼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶摄。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓属韧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親准谚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挫剑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355