Относительно вашего первого вопроса об общем поиске базы поиска:
Каждый сервер каталогов LDAP (в соответствии с протоколом LDAP, я думаю) предоставляет некоторые рабочие вещи в узле, называемом RootDSE . RootDSE можно получить с помощью namingContexts , который, по сути, может сказать вам, какие различные деревья размещены на этом сервере.
Таким образом, вы можете получить базу поиска верхнего уровня для поиска по имени пользователя. Обратите внимание: на некоторых серверах 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)).