LDAP - Referral
这篇文章介绍了如何实做 LDAP v3 的 Referral 功能,请记得,是 LDAP v3,因为 LDAP v2 未支援 Referral 的功能。
假如在您的环境中,想要授权一个子单位下去,而您希望这个子单位自己维护自己的 LDAP,比方说台北总公司授权到高雄的子公司,当然这就很像 DNS 里的授权子网域一样,那么当总公司要查高雄子公司的名录时,就会直接连线到高雄的 LDAP 做查询,现在我们就来看看如何实做。
如果您不知道如何开始,或是要从头建立一个跟我一样的范例,可以参考以下资料:
如果您是依照之前文章的架构来实做,那么您应该有一个主要的 LDAP Server,现在我们就为 l-penguin Corp. 公司再建立一个高雄子公司的 LDAP,当要查询高雄的资料时,就会直接依 LDAP 的参照查下去。
也就是说,我们加了一条:
l-penguin.idv.tw -> company -> branch -> ldap-kh
是的,就如您所想的一样,必需还要再加入一个 branch 的 ou,并且还要为 kh 做一个指定的参照。
设定总公司 LDAP
当然了,小弟会把新增一个 ou 的技巧视为您已经必需有的知识,所以在此只列出 ldap-kh 的做法。
0001 0002 0003 0004 0005 |
dn: ou=kh,ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw ou: kh objectClass: extensibleObject objectClass: referral ref: ldap://ldap-kh.l-penguin.idv.tw/ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw |
好吧好吧!小弟真的不是有意要猜中,此时的你应该会想说如果有一个现成的档案下载就好了,我已经听到您的声音,所以就请点 这里 来下载为您准备好的 branch ldif 档罗!
新增 LDIF
不知您是否还记得如何新增一个 ldif 档案的命令,您可以使用下列方法来新增。
0001 0002 |
root # ldapadd -H ldap://ldap.l-penguin.idv.tw/ -D "cn=Manager,dc=l-penguin,dc=idv,dc=tw" -w secret -x -f /etc/openldap/data/branch.ldif root # |
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 |
root # ldapsearch -x -b "ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw" # extended LDIF # # LDAPv3 # base <ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw> with scope subtree # filter: (objectclass=*) # requesting: ALL # # branch, company, l-penguin.idv.tw dn: ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw ou: branch objectClass: organizationalUnit # search reference ref: ldap://ldap-kh.l-penguin.idv.tw/ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw??sub # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 1 # numReferences: 1 root # |
设定 slap.conf
当然了,您需要先设定好 slapd.conf 档案之后才可以汇入 LDIF 档案。
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 |
root # vi /etc/openldap/slapd.conf -------------------------------------------------------------- # 直接设定 ou 的 root suffix。 suffix "ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw" rootdn "cn=Manager,ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw" rootpw secret # 若找不到名录,则向上寻找指定的名录伺服器。 referral ldap://ldap.l-penguin.idv.tw:389/ -------------------------------------------------------------- root # |
对於 ldap-kh 而言,首先就是要先建立 ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw 这个 dn,因为你的 ldap.l-penguin.idv.tw 已指向他了,所以必需要如此做才行,否则在查寻时会对应不到。以下是 ldap-kh 的 ou LDIF。
0001 0002 0003 0004 0005 |
#kh branch top dn: ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw ou: ldap-kh objectClass: organizationalUnit |
汇入 LDIF 档
使用以下方式就可以简单的汇入
0001 0002 0003 |
root # slapadd -v -l /etc/openldap/data/kh-root.ldif added: "ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw" (00000002) root # |
建立单位人员通讯录
有了单位的 ou,那么应该可以马上想到需要有人员名录,没关系,在您努力的尝试建立测试用名录时,小弟又贴心的帮您贴上这个人员名录 LDIF 档了,请点选 这里 下载。
当然了,你所下载好的名录是已转存成 UTF8 格式档案,所以就不需要再使用 iconv 转一次罗。
0001 0002 |
root # ldapadd -H ldap://ldap-kh.l-penguin.idv.tw -D "cn=Manager,ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw" -w secret -x -f kh-usr.ldif.utf8 root # |
使用 LDAP Browser 测试
使用 ldapsearch 测试
也许聪明的你已经知道可以使 ldapsearch 来测试看看是否正确,但预设 ldapsearch 并不会依参照去询找 ldap-kh.l-penguin.idv.tw 的名录,就像如下所示:
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 |
root # ldapsearch -x -b "ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw" # extended LDIF # # LDAPv3 # base <ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw> with scope subtree # filter: (objectclass=*) # requesting: ALL # # branch, company, l-penguin.idv.tw dn: ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw ou: branch objectClass: organizationalUnit # search reference ref: ldap://ldap-kh.l-penguin.idv.tw/ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw??sub # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 1 # numReferences: 1 root # |
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 |
root # ldapsearch -C -x -b "ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw" # extended LDIF # # LDAPv3 # base <ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw> with scope subtree # filter: (objectclass=*) # requesting: ALL # # branch, company, l-penguin.idv.tw dn: ou=branch,ou=company,dc=l-penguin,dc=idv,dc=tw ou: branch objectClass: organizationalUnit # ldap-kh, l-penguin.idv.tw dn: ou=ldap-kh,dc=l-penguin,dc=idv,dc=tw ou: ldap-kh objectClass: organizationalUnit # E69D8EE7A78BE8908D, ldap-kh, l-penguin.idv.tw dn:: Y2495p2O56eL6JCNLG91PWxkYXAta2gsZGM9bC1wZW5ndWluLGRjPWlkdixkYz10dw== cn:: 5p2O56eL6JCN sn: N/A objectClass: person ~ 以下略 ~ root # |
小弟到目前为止,一共写了七篇有关 OpenLDAP 的实例与应用,在一次偶然的情况之下,发现大家对 LDAP 入门 (new window) 有很多的阅读次数,而在 Google 的查寻之下也发现 LDAP 入门 有很多人连结,小弟在此跟各位说声感谢。
LDAP 应用无限宽广,很多应用需要有环境配合才有办法做出实例,希望小弟这几篇的文章能带动更多 LDAP 的先进们一同写出 LDAP 的实例应用,达到抛砖引玉的效果。
Last modified: 03/03/2007