关于Java LDAP登录集成

Posted 唐凯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java LDAP登录集成相关的知识,希望对你有一定的参考价值。

最近项目需要集成LDAP的登录,所以简单研究了一下ldap的集成主要有以下几个步骤:

一、配置spring boot的LDAP配置文件

1.配置pom文件:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-ldap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

    </dependencies>

  2.配置LDAP的数据元信息:

spring.ldap.urls=ldap://127.0.0.1:389
spring.ldap.base=DC=dc-test,DC=com
spring.ldap.username=cn=cnName,ou=ouName,dc=dc-test,dc=com
spring.ldap.password=******

  这样配置就可以正常的查询ldap的数据信息了

二、查询实例:

        ldapTemplate.lookup("OU=ouName", new AttributesMapper<Object>() {
            @Override
            public Object mapFromAttributes(Attributes attributes) throws NamingException {
                return attributes;
            }
        });

  一开始一直不能查询到数据提示:

org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-03100238, problem 2001 (NO_OBJECT), data 0, best match 

  原因其实就是查询的条件不对,我这边查询的时候应该从我这边给定的ou开始查询比如我这边给定的是ouName所以应该从ouName开始查询,如果要查询下级则需要两个条件一起输入查询比如

 

        ldapTemplate.lookup("OU=ouNameNext,OU=ouName", new AttributesMapper<Object>() {
            @Override
            public Object mapFromAttributes(Attributes attributes) throws NamingException {
                return attributes;
            }
        });

  注意结构应该是左边是下级部门,右边是上级部门

三、最后递归查询所有的部门及成员信息:

       @Test
    public void getAllTree() {
        List<NameClassPair> nameList = new ArrayList<>();
        getCurrentDept("OU=ouName", nameList);
}


 private void getCurrentDept(String base, List<NameClassPair> nameList) {
        List<NameClassPair> nameClassPairMapperList = ldapTemplate.list(base, new NameClassPairMapper() {
            @Override
            public NameClassPair mapFromNameClassPair(NameClassPair nameClassPair) throws NamingException {
                return nameClassPair;
            }
        });
        if (nameClassPairMapperList.size() == 0) {
            return;
        }
        for (NameClassPair nameClassPair : nameClassPairMapperList) {
//            System.out.println(nameClassPair.getNameInNamespace().substring(0, nameClassPair.getNameInNamespace().indexOf("DC") - 1));
            getCurrentDept(nameClassPair.getNameInNamespace().substring(0, nameClassPair.getNameInNamespace().indexOf("DC") - 1), nameList);
        }
        nameList.addAll(nameClassPairMapperList);

    }

  

 

以上是关于关于Java LDAP登录集成的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)

Ubuntu 通过ldap集成AD账号登录

confluence5.8.10集成ldap登录

Hive Impala和Hue集成LDAP

Artifactory LDAP集成问题

如何为我的 Web 应用程序构建 LDAP 集成?