ldap 組織結(jié)構(gòu)如何轉(zhuǎn)成多叉樹?
工作中,ldap 服務(wù)器的對(duì)接,可以能會(huì)涉及到同步組織結(jié)構(gòu),認(rèn)證,認(rèn)證后處理等等,最近認(rèn)證還不是我想寫的剛需,繼續(xù)來看看對(duì)于組織結(jié)構(gòu)的想法
例如同步 AD 域的組織結(jié)構(gòu),或者是 ldap 協(xié)議的其他產(chǎn)品對(duì)應(yīng)的企業(yè)組織結(jié)構(gòu),如下我簡(jiǎn)單的創(chuàng)建的一些 ou 和 cn

查看當(dāng)前 ldap 組織結(jié)構(gòu)
我們通過命令查看 ldap 服務(wù)器上的組織結(jié)構(gòu)數(shù)據(jù),咱們只查看 DN 即可,不需要其他的屬性
?ldapsearch?-x?-LLL?-b?dc=xiaomotong,dc=com?objectClass=*?d:

我們可以看到,ldap 服務(wù)器給我們返回的數(shù)據(jù)中,是 1 個(gè) list ,這個(gè)list 里面每 1 個(gè)元素是 1 個(gè) entry,是 1 條記錄,也是 1 個(gè)唯一的標(biāo)識(shí)
那么問題就很明確了,如何將上述的 dn list ,轉(zhuǎn)成 1 棵樹呢?
我們可以根據(jù)上述打印結(jié)果畫圖,進(jìn)行分析一下
先畫一棵樹
根據(jù)上面的打印結(jié)果,在和實(shí)際ldap admin 可視化工具中可以看出,根實(shí)際是在最后 dc=xiaomotong,dc=com
,然后從右往左 分別是 ou,cn
前 5 條數(shù)據(jù)對(duì)應(yīng)畫出來的圖是這樣的:
看上去有戲,繼續(xù)往下畫看看效果:
紅色框?yàn)?ou
綠色框?yàn)?dc
藍(lán)色框?yàn)?cn

對(duì)就是這樣的一棵樹,畫出來了,可是我們?nèi)绾斡么a實(shí)現(xiàn)一下呢?
編碼實(shí)現(xiàn)
編碼實(shí)現(xiàn)將 ldif 格式的數(shù)據(jù)轉(zhuǎn)成樹,并用 json 的方式輸出,查看效果
實(shí)現(xiàn)方式
1、遍歷每一條 entry
2、處理每一條 entry 的時(shí)候,從右到左獲取相應(yīng)的 rdn(對(duì)應(yīng)的鍵和值),并給每一個(gè) rdn 創(chuàng)建一個(gè) 多叉樹的 節(jié)點(diǎn)
3、basedn 對(duì)應(yīng)的節(jié)點(diǎn) 和 每一個(gè) ou 對(duì)應(yīng)的節(jié)點(diǎn)地址,存放到一個(gè) map(key 是 string,value 是節(jié)點(diǎn)的地址) 中便于后續(xù)遍歷處理其他 entry 的時(shí)候,直接通過 ou 名字獲取對(duì)應(yīng)節(jié)點(diǎn)地址即可
4、對(duì)于一個(gè)節(jié)點(diǎn)下面的用戶,直接掛到這個(gè)節(jié)點(diǎn)上即可
畫個(gè)圖來闡述一下 map 的作用:
例如我們需要畫一個(gè)組織結(jié)構(gòu),先畫根節(jié)點(diǎn)

現(xiàn)在我們要遍歷對(duì)應(yīng)的 entry,例如:
cn=B,dc=A
ou=C,dc=A
ou=D,dc=A
需要畫上 B,C,D ,我們分別創(chuàng)建好對(duì)應(yīng)的節(jié)點(diǎn),但是如何掛到 A上面去的呢?這個(gè)時(shí)候,是不是就需要 A 的地址了,正好這個(gè) entry 又能獲取到 A 的名字,也就是 map 的key,這樣子,我們就可以獲取到 A 的地址了

繼續(xù)解析 entry
ou=E,ou=C,dc=A
cn=F,ou=E,ou=C,dc=A
原理同上

通過上面的簡(jiǎn)圖,算是可以將 ldap 的 ldif 格式的數(shù)據(jù),轉(zhuǎn)換成我們想要的樹了,思路是有了,編碼的話就很快了 具體編碼可以看下一篇
學(xué)習(xí)所得,如有偏差,還請(qǐng)不吝賜教
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽(yáng)而生,努力向前行。
我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見~