美文网首页
SpringBoot+LDAP

SpringBoot+LDAP

作者: inverseli | 来源:发表于2018-09-24 14:00 被阅读0次

    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内存服务器,所以方便测试,不需要进行过多的安装。

    项目结构

    project

    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版本,不知道新版本哪里更新了,测试的时候总是出现空指针问题,还没有解决。

    相关文章

      网友评论

          本文标题:SpringBoot+LDAP

          本文链接:https://www.haomeiwen.com/subject/nugcoftx.html