可能有很多答案。一个可能的答案是使用主体构造一个基本 DN,并使用范围base、过滤器'(&)'和请求isMemberOf属性查询目录服务器。例如,在我使用现代ldapsearch命令行工具和主体的测试系统上user.0:
ldapsearch --hostname localhost --port 1389 \
--bindDN 'cn=directory manager' --baseDn \
'uid=user.0,ou=people,dc=example,dc=com' \
--searchScope base '(&)' isMemberOf
Password for user 'cn=directory manager':
dn: uid=user.0,ou=people,dc=example,dc=com
isMemberOf: cn=shadow entries,ou=groups,dc=example,dc=com
isMemberOf: cn=persons,ou=groups,dc=example,dc=com
此方法需要了解namingContext,在这种情况下dc=example,dc=com,以及用户在树中的位置。当用户的位置未知时,另一种类似的方法是首先搜索用户,然后使用搜索结果中的专有名称来执行上述查询。如果namingContext不知道,则可以namingContext从根 DSE 发现 。namingContext要从根 DSE恢复,请参阅本文。
有一些广泛使用的目录服务器不正确支持 LDAP 标准并且会拒绝过滤器'(&)',如果您的目录服务器是其中之一,只需替换存在过滤器即可'(objectClass=*)'。有许多用于 Java 的 LDAP SDK,我更喜欢UnboundID中的一个。