LDAP
LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。
目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。
目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。
目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP 之上的访问协议—LDAP。
LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中表的记录;
LDAP简称
o - organization
ou - organization unit
c - countryName
dc - domainComponent
sn - suer name
cn - common name
dn - Distinguished Name,LDAP中entry的唯一辨别名
base dn (在下边的例子中有提到)
执行LDAP search时一般要指定base dn,由于LDAP是树状数据结构,指定base dn后,搜索将从base dn开始。
objectClass
结构型(Structural):如account、inetOrgPerson、person和organizationUnit;
辅助型(Auxiliary):如extensibeObject;
抽象型(Abstract):如top,抽象型的objectClass不能直接使用。
规定了就是说指定为特定的objectClass之后,有些属性就是必须要有的例如,account就要求userid是必填项,而inetOrgPerson则要求cn(common name,常用名称)和sn(sure name,真实名称)是必填项。
SpringBoot+LDAP
- springboot封装了嵌入式LDAP内存服务器,所以方便测试,不需要进行过多的安装。
项目结构
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
<!-- LDAP测试-->
<dependency>
<groupId>com.unboundid</groupId>
<artifactId>unboundid-ldapsdk</artifactId>
<scope>test</scope>
</dependency>
Person.java
package com.inverseli.learning.entity;
import javax.naming.Name;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.DnAttribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import lombok.Data;
/**
* @date:2018年9月24日 上午12:24:44
* @author liyuhao
* @version 1.0
* @since JDK 1.8
* @description:
*/
@Entry(base = "ou=people,dc=learning,dc=inverseli,dc=com",objectClasses="inetOrgPerson")
@Data
public class Person {
@Id
private Name id;
@DnAttribute(value="uid",index = 3)
private String uid;
@Attribute(name = "cn")
private String commonName;
@Attribute(name = "sn")
private String suerName;
private String userPassword;
}
PersonRepository.java
package com.inverseli.learning;
import javax.naming.Name;
import org.springframework.data.repository.CrudRepository;
import com.inverseli.learning.entity.Person;
/**
* @date:2018年9月24日 上午12:30:56
* @author liyuhao
* @version 1.0
* @since JDK 1.8
* @description:
*/
public interface PersonRepository extends CrudRepository<Person, Name>{
// extends CrudRepository to crud
}
src/test/resources/application.properties
# classpath
spring.ldap.embedded.ldif=classpath:ldap-server.ldif
spring.ldap.embedded.base-dn=dc=learning,dc=inverseli,dc=com
ldap-server.ldif
# 注释的内容都是我自己的理解,可能会有不对的地方
# com.inverseli.learning是基本dn,从这里开始搜索
dn: dc=learning,dc=inverseli,dc=com
objectClass: top
objectClass: domain
# base dn的分支 people
dn: ou=people,dc=learning,dc=inverseli,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people
# 这里就是一个person对象了
dn: uid=inverse,ou=people,dc=learning,dc=inverseli,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
# 这里是用户信息
cn: inverse
sn: lyh
uid: inverse
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=
踩过的坑
SpringBoot的版本用的是1.5.9版本,刚开始用的是2.0.0版本,不知道新版本哪里更新了,测试的时候总是出现空指针问题,还没有解决。