最近項目需要集成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); }