关于您关于一般检索搜索库的第一个问题:
每个 LDAP 目录服务器(我认为符合 LDAP 协议)都会在一个名为RootDSE的节点下公开一些可操作的东西。您可以通过RootDSE检索的其中一件事是命名上下文,它基本上可以告诉您此服务器上托管的不同树。
因此,您可以为您的用户名搜索检索顶级搜索库。请注意:某些 LDAP(例如 OpenLDAP)服务器可以托管多个树,因此当找到多个命名上下文时,您必须想出一个解决方案。
RootDSE可以通过向服务器查询 DN ""(空字符串)并指定您也想要获取所有操作属性来检索。只是 OpenLDAP 服务器的一些示例:
ldapsearch -H ldap://ldap.mydomain.com -x -s base -b "" +
# note the + returns operational attributes
这应该返回类似于下面显示的内容(来自 OpenLDAP 2.4.8) - 括号中的值是添加的解释,服务器不会返回:
dn:
structuralObjectClass: OpenLDAProotDSE
configContext: cn=config
namingContexts: dc=example,dc=com
namingContexts: dc=example,dc=net
monitorContext: cn=Monitor
supportedControl: 1.3.6.1.4.1.4203.1.9.1.1 (Contentsync RFC 4530)
[...]
supportedExtension: 1.3.6.1.4.1.4203.1.11.1 (ModifyPassword RFC3088)
[...]
supportedFeatures: 1.3.6.1.1.14 (Modify-Increment RFC4525)
[...]
supportedLDAPVersion: 3
supportedSASLMechanisms: NTLM
[...]
entryDN:
subschemaSubentry: cn=Subschema
(来自http://www.zytrax.com/books/ldap/ch3/#operational)
关于您关于uid
属性可用性的第二个问题:
我不认为你应该依赖这个,因为它很大程度上取决于用于存储用户数据的模式(尽管uid
我认为大多数用户模式类都会有一个属性)。但这取决于您想在程序中添加的灵活性。也许最好的方法是让最终用户可以配置用户过滤器字符串(您甚至可以使用搜索库来执行此操作,这将具有一些性能优势(当用户仅位于一个小的子树,不需要查询 RootDSE))。