|
该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 Spring LDAP 4.0.0! |
对象-目录映射(ODM)
对象-关系映射框架(如 Hibernate 和 JPA)为开发者提供了使用注释将关系数据库表映射到 Java 对象的能力。
Spring LDAP 项目通过多种方法在Ldap运营:
-
<T> t findByDn(名称 dn, class<T> clazz) -
<T> T findOne(LdapQuery query, Class<T> clazz) -
<T> List<T> find(LdapQuery query, Class<T> clazz) -
<T> 列表<T> findAll(Class<T> clazz) -
<T> List<T> findAll(Name base, SearchControls searchControls, Class<T> clazz) -
<T> List<T> findAll(Name base, Filter filter, SearchControls searchControls, Class<T> clazz) -
void create(Object entry) -
void update(Object entry) -
void delete(Object entry)
配置
LdapTemplate构造默认值ObjectDirectoryMapper这通常使得额外的配置变得不必要。
带启动的转换器
ObjectDirectoryMapper支持转换服务这允许你指定客户转炉用于 Java 和 LDAP 之间的映射。
使用Spring Boot时,你可以简单地发布一个转炉就像你通常会这样,而且ObjectDirectoryMapperBoot提供的豆子会把它们接走。
无启动转换器
你也可以做ObjectDirectoryMapper可作为@Bean通过导入ObjectDirectoryMapperConfiguration这样:
@Import(ObjectDirectoryMapperConfiguration.class)
@Configuration
public class LdapConfig {
// ...
}
然后你可以把它供应给你的LdapTemplate实例如下:
@Bean
LdapTemplate ldapTemplate(ContextSource contextSource, ObjectDirectoryMapper odm) {
LdapTemplate ldap = new LdapTemplate(contextSource);
ldap.setObjectDirectoryMapper(odm);
return ldap;
}
这样做会让Spring LDAP使用你的配置转炉实例。
附注
使用对象映射方法管理的实体类必须用来自org.springframework.ldap.odm.annotations包。可用的注释有:
-
@Entry: 类级注释表示objectClass实体映射的定义。 (必填) -
@Id: 表示实体DN。声明该属性的域必须是javax.naming.Name类别。(必修) -
@Attribute: 表示将目录属性映射到对象类字段。 -
@DnAttribute表示 DN 属性映射到对象类字段。 -
@Transient表示该字段不持久,应被 忽略OdmManager.
这@Entry和@Id注释必须在托管类上声明。@Entry用于指定实体映射到哪些对象类,以及(可选地)该类所表示的LDAP项的目录根。
所有映射字段的对象类都必须声明。注意,在创建托管类的新条目时,
只使用声明的对象类。
为了使目录条目被视为与受管理实体匹配,所有由目录条目声明的对象类必须由@Entry注解。
例如,假设你的LDAP树中有包含以下对象类的条目:inet组织人、组织人、人、顶部.
如果你只想更改定义在人对象类,你可以注释你的@Entry跟@Entry(objectClasses = { “person”, “top” }).
然而,如果你想管理定义在inetOrgPersonObjectclass,你需要使用以下内容:@Entry(objectClasses = { “inetOrgPerson”, “organizationalPerson”, “person”, “top” }).
所有实体字段均通过字段名称映射到 LDAP 属性。剩余注释——@Id,@Attribute,@Transient和@DnAttribute——影响映射的发生方式。
首先,该@Id注释将条目名称映射到字段。该域必须是 的实例javax.naming.Name.
其次,@Attribute注释将实体字段映射到 LDAP 属性。
当属性名和字段名不同时,这很方便。
使用@Attribute你必须声明该字段所映射的属性名称。
可选地,你也可以保证并精确匹配,通过包含 LDAP 属性的语法 OID。
最后@Attribute还提供类型声明,允许你指示该属性在 LDAP JNDI 提供者眼中是基于二进制还是基于字符串。
第三,@Transient注释表示给定的实体字段不映射到LDAP属性。
最后,是@DnAttribute注释还将实体字段映射到条目区分名称的组成部分。
考虑一个带有以下注释的类:
@DnAttribute(name="uid")
String uid;
以及如下这样的DN:
uid=carla,dc=springframework,dc=org
然后春季LDAP会生成UID用uid=carla而不是去寻找UID属性。
Only fields of type `String` can be annotated with `@DnAttribute`. Other types are not supported.
你也可以提供如下的索引:
@DnAttribute(index=1)
String uid;
@DnAttribute(index=0)
String department;
这对拥有多个组件的DN非常有用:
uid=carla,department=engineering,dc=springframework,dc=org
使用指数同时,Spring LDAP也能在创建或定位实体进行更新或删除时自动计算DN。
对于更新场景,如果区分名称中的属性发生变化,这也会自动处理树中条目的移动。
Note that while both attributes are present on `@DnAttribute`, if `index` is specified, then `name` is ignored.
请记住,所有字段默认映射到 LDAP 属性。@DnAttribute但不会改变这一点;换句话说,标注为@DnAttribute也会映射到 LDAP 属性,除非你也用 来注释字段@Transient. |
执行
当所有组件都配置并注释完毕后,对象映射方法的LdapTemplate可以如下方式使用:
@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以及作为属性价值的杰出名称.
ODM 也支持javax.naming.Name属性值,使组修改变得简单,如下示例所示:
@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);
}
}
当你通过使用来修改组成员时成员,addMember和移除成员然后呼唤ldapTemplate.update(),
属性修改通过使用区分名称相等计算,意味着文本格式
在判断它们是否相等时,区分名称被忽略。