具有动态基本DN

时间:2015-09-04 08:48:10

标签: java spring ldap openldap spring-ldap

我有以下LDAP方案:

enter image description here

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

ldapTemplate.findAll(Team.class);

当我将LdapContextSource设置为dc=global,dc=id,dc=pl时,它会从全局子树返回我的团队。当我将基数更改为dc=id,dc=pl时,它会返回所有子树中的团队。

问题是我想使用动态库,从特定的子树中查找团队。我已经尝试了多种方法来实现这一点,但它们都没有给我结果。

方法1:查找

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

返回空列表

方法2:findAll

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

返回空列表

起初看起来工作正常,因为当我将子树名称更改为不存在的名称时,我得到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

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

<强>第一

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);