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);
我有以下 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);