【问题标题】:Spring Ldap - multipe base namesSpring Ldap - 多重基本名称
【发布时间】:2014-10-27 07:22:44
【问题描述】:

我只是在尝试 spring ldap /odmnow。看起来很有趣也很酷。对不起,如果下面的问题太愚蠢了!

我正在尝试使用 spring ldap /odm 从 ldap 中检索一些属性。有没有办法在

中配置多个基本名称

或在

@Entry(objectClasses = { "person"} base={..CAN I GIVE MULTIPLE BASENames here..})
public class LdapUser {

    @Id
    private Name dn;

    //..
}

我正在开发的应用程序在我们的 AD 中的一个 OU 中定义了用户和在另一个 OU 中定义的内部测试人员。所以我想看看我是否可以使用相同的 ldap 入口类来查找每个人。

【问题讨论】:

  • 以下部分已从我上面的帖子中删除。我还想知道是否有一种方法可以在

标签: spring spring-ldap


【解决方案1】:

ContextSource base 用于指定ContextSource所有 操作的基础,通常设置为域控制器 DN。

您可以使用 ODM,而无需在 @Entry 上指定基础(或使用树中较高的基础 DN),但在这种情况下,您通常会使用 @DnAttribute 注释来自动构建框架为您提供的 DN(主要在将条目持久化回 LDAP 时需要)。

如果我们假设您的用户具有以下结构:

dc=example,dc=com,ou=USERS

dc=example,dc=com,ou=TESTERS

现在,如果您在 ContextSource 上指定 base dc=example,dc=com,您可以让 ODM 自动处理此问题,如下所述:

@Entry(objectclasses={"person"})
public class Person {
  @Id
  private Name dn;

  @DnAttribute(name="ou", index=0)
  @Transient // Indicates that this is not an attribute on the entry
  private String userType;

  @Attribute(name="cn")
  private String name;

  // More attributes here
}

上面将处理 LDAP 条目与 Person 类之间的自动映射。现在,如果您想查找所有人,请执行以下操作:

List<Person> allPersons = ldapTemplate.findAll(Person.class);

如果您想找到所有测试人员,您会这样做:

List<Person> testers = ldapTemplate.find(
                            query().base("ou=TESTERS"), 
                            Person.class);

【讨论】:

  • 谢谢。我昨天确实让它工作了。定义了两个 ldaptemplates/context 源和没有基名的入口类 - 并制作了 ldaptemplate1.findone().. 和 ldaptemplate2.findone() 。我的请求非常简单...需要使用电子邮件 ID 从 ldap 获取 fname 和 lname...我缓存信息以供后续读取...也不想过度设计它。
【解决方案2】:

我对 Spring LDAP 不是很熟悉,但是 (IIRC) LDAP 本身只能从单个节点(基础)进行搜索。因此,查看the documentation,您可能需要使用LDAPQueryBuilder 从组织(o=xx) 中进行搜索,为ous 添加条件。见the javadocs

【讨论】:

  • 谢谢加里! Ldapquerybuilder 是我的另一个选择。我可能会在明天实施它
【解决方案3】:

请注意,这里没有专家。 至少使用 XML 配置,您可以连接 LdapTemplate 实例。一个建议可能是创建一个名为 DelegatingLdapTemplate 的新实现,该实现注入两个常规模板(每个基本名称一个),然后适当地委托给它们(或者只调用一个,如果第一个返回 0 结果,则调用另一个),并且使用它来代替普通的模板实例。这当然只有在您的用例确实需要这种行为时才有意义(例如,如果您永远不知道在哪里搜索用户并且必须检查两个位置)。否则,只需制作两个单独的豆子。

【讨论】:

  • 谢谢kaqqao!我确实考虑过这些选项。我觉得他们是更多的解决方法。我希望 ldap:contextsource 将采用一组基本名称,以便在 ldap 中简单地查找不同节点 (ou) 下的条目,并省去我的样板代码:)...
  • 如果你给 ContextSource 一个基名称数组,框架如何知道何时使用哪个基名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2013-01-11
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多