Spring 具有动态基本 DN 的 LDAP

Spring LDAP with dynamic base DN

我有以下 LDAP 方案:

每个子树包含组织单位团队。我想从特定子树中找到所有团队。为此,我使用 LdapTemplate class 和 findAll() 方法。

ldapTemplate.findAll(Team.class);

当我将 LdapContextSource 中的基础设置为 dc=global,dc=id,dc=pl 时,它 returns 我来自全局子树的团队。当我将 base 更改为 dc=id,dc=pl 时,它 returns 我来自所有子树的团队。

问题是我想使用动态基础从特定子树中查找团队。我已经尝试了多种方法来实现这一点,但其中 none 给了我结果。

方法一:查找

Name nameBase = LdapUtils.newLdapName("dc=global");
return ldapTemplate.find(query().base(nameBase).where("ou").is("team"), Team.class);

returns 空列表

方法二:findAll

Name nameBase = LdapUtils.newLdapName("dc=global");
SearchControls searchControls = new SearchControls();
return ldapTemplate.findAll(nameBase, searchControls, Team.class);

returns 空列表

起初看起来工作正常,因为当我将子树名称更改为不存在的名称时,我得到 javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]

为什么我在这段代码中得到正确结果的任何想法:

LdapContextSource contextSource = new LdapContextSource();
contextSource.setBase("dc=global,dc=id,dc=pl");

LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
return ldapTemplate.findAll(Team.class);

还有这个空列表:

LdapContextSource contextSource = new LdapContextSource();
contextSource.setBase("dc=id,dc=pl");

LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
Name nameBase = LdapUtils.newLdapName("dc=global");
SearchControls searchControls = new SearchControls();
return ldapTemplate.findAll(nameBase, searchControls, Team.class);

我用的是Spring-ldap-core 2.0.3

我找到了解决方案。

第一

SearchControls

添加适当的范围
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
return ldapTemplate.findAll(base, searchControls, Team.class);

第二

正在更改查询参数以检查 cn 是否存在

return ldapTemplate.find(query().base(base).where("cn").isPresent(), Team.class);