此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring LDAP 3.2.8spring-doc.cn

对象目录映射 (ODM)

对象关系映射框架(如 Hibernate 和 JPA)使开发人员能够使用注释将关系数据库表映射到 Java 对象。 Spring LDAP 项目通过以下中的多种方法为 LDAP 目录提供了类似的功能:LdapOperationsspring-doc.cn

附注

使用对象映射方法管理的实体类需要使用包中的注释进行注释。可用的注释包括:org.springframework.ldap.odm.annotationsspring-doc.cn

  • @Entry:类级别注释,指示实体映射到的定义。 (必填)objectClassspring-doc.cn

  • @Id:表示实体 DN。声明此属性的字段必须是类的派生项。(必需)javax.naming.Namespring-doc.cn

  • @Attribute:指示目录属性到对象类字段的映射。spring-doc.cn

  • @DnAttribute:指示 DN 属性到对象类字段的映射。spring-doc.cn

  • @Transient:指示字段不是永久性的,应被 .OdmManagerspring-doc.cn

需要在托管类上声明 和 注释。 用于指定实体映射到哪些对象类,以及(可选)类所表示的 LDAP 条目的目录根。 需要声明映射了字段的所有对象类。请注意,在创建托管类的新条目时, 仅使用声明的对象类。@Entry@Id@Entryspring-doc.cn

为了将目录条目视为与托管实体匹配,该目录条目声明的所有对象类都必须由注释声明。 例如,假设您的 LDAP 树中有具有以下对象类的条目:。 如果只想更改对象类中定义的属性,则可以使用 . 但是,如果要管理 objectclass 中定义的属性,则需要使用以下命令:.@EntryinetOrgPerson,organizationalPerson,person,topperson@Entry@Entry(objectClasses = { "person", "top" })inetOrgPerson@Entry(objectClasses = { "inetOrgPerson", "organizationalPerson", "person", "top" })spring-doc.cn

所有实体字段都按其字段名称映射到 LDAP 属性。其余注释 — 、 、 和 — 会影响该映射的发生方式。@Id@Attribute@Transient@DnAttributespring-doc.cn

首先,注释将条目的专有名称映射到字段。该字段必须是 的实例。@Idjavax.naming.Namespring-doc.cn

其次,注释将实体字段映射到 LDAP 属性。 当属性名称与字段名称不同时,这很方便。 要使用 ,必须声明字段映射到的属性的名称。 (可选)您还可以通过包含 LDAP 属性的语法 OID 来保证和完全匹配。 最后,还提供了类型声明,它允许您指示 LDAP JNDI 提供程序是将该属性视为基于二进制的还是基于字符串的。@Attribute@Attribute@Attributespring-doc.cn

第三,注释指示给定的实体字段未映射到 LDAP 属性。@Transientspring-doc.cn

最后,该注释还将实体字段映射到条目的可分辨名称的组件。@DnAttributespring-doc.cn

考虑具有以下 Comments 的类:spring-doc.cn

@DnAttribute(name="uid")
String uid;

以及如下所示的 DN:spring-doc.cn

uid=carla,dc=springframework,dc=org

然后 Spring LDAP 将使用而不是查找属性进行填充。uiduid=carlauidspring-doc.cn

Only fields of type `String` can be annotated with `@DnAttribute`. Other types are not supported.

您也可以提供如下所示的索引:spring-doc.cn

@DnAttribute(index=1)
String uid;

@DnAttribute(index=0)
String department;

这对于具有多个组件的 DN 非常方便:spring-doc.cn

uid=carla,department=engineering,dc=springframework,dc=org

使用 an 还允许 Spring LDAP 在创建或查找要更新或删除的实体时为您计算 DN。 对于更新方案,如果属于可分辨名称的属性已更改,这也会自动处理树中的移动条目。indexspring-doc.cn

Note that while both attributes are present on `@DnAttribute`, if `index` is specified, then `name` is ignored.
请记住,默认情况下,所有字段都映射到 LDAP 属性。 不会改变这一点;换句话说,带有 注释的字段也将映射到 LDAP 属性,除非您还使用 .@DnAttribute@DnAttribute@Transient

执行

当所有组件都已正确配置和注释后,可以按如下方式使用 的对象映射方法:LdapTemplatespring-doc.cn

示例 1.执行
@Entry(objectClasses = { "person", "top" }, base="ou=someOu")
public class Person {
   @Id
   private Name dn;

   @Attribute(name="cn")
   @DnAttribute(value="cn", index=1)
   private String fullName;

   // No @Attribute annotation means this will be bound to the LDAP attribute
   // with the same value
   private String description;

   @DnAttribute(value="ou", index=0)
   @Transient
   private String company;

   @Transient
   private String someUnmappedField;
   // ...more attributes below
}


public class OdmPersonRepo {
   @Autowired
   private LdapTemplate ldapTemplate;

   public Person create(Person person) {
      ldapTemplate.create(person);
      return person;
   }

   public Person findByUid(String uid) {
      return ldapTemplate.findOne(query().where("uid").is(uid), Person.class);
   }

   public void update(Person person) {
      ldapTemplate.update(person);
   }

   public void delete(Person person) {
      ldapTemplate.delete(person);
   }

   public List<Person> findAll() {
      return ldapTemplate.findAll(Person.class);
   }

   public List<Person> findByLastName(String lastName) {
      return ldapTemplate.find(query().where("sn").is(lastName), Person.class);
   }

   public Stream<Person> streamFindByLastName(String lastName) {
      return ldapTemplate.findStream(query().where("sn").is(lastName), Person.class);
   }
}

ODM 和专有名称作为属性值

LDAP 中的安全组通常包含一个多值属性,其中每个值都是可分辨名称 系统中的用户。处理这些类型的属性时涉及的困难在DirContextAdapter和作为属性值的可分辨名称中进行了讨论。spring-doc.cn

ODM 还支持属性值,使组修改变得容易,如下例所示:javax.naming.Namespring-doc.cn

示例 2.组表示示例
@Entry(objectClasses = {"top", "groupOfUniqueNames"}, base = "cn=groups")
public class Group {

    @Id
    private Name dn;

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

    @Attribute(name="uniqueMember")
    private Set<Name> members;

    public Name getDn() {
        return dn;
    }

    public void setDn(Name dn) {
        this.dn = dn;
    }

    public Set<Name> getMembers() {
        return members;
    }

    public void setMembers(Set<Name> members) {
        this.members = members;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void addMember(Name member) {
        members.add(member);
    }

    public void removeMember(Name member) {
        members.remove(member);
    }
}

当您使用 、 ,然后调用 、 来修改组成员时, 属性修改是使用专有名称相等性计算的,这意味着 在确定它们是否相等时,将忽略 distinguished names。setMembersaddMemberremoveMemberldapTemplate.update()spring-doc.cn