【问题标题】:Try to use spring-data-ldap with ActiveDirectory尝试将 spring-data-ldap 与 Active Directory 一起使用
【发布时间】:2017-09-06 13:11:34
【问题描述】:

我尝试将 Spring-Data-Ldap 与 ActiveDirectory 一起使用。 我想列出用户并查找特定用户。

我的主要课程:

@SpringBootApplication
@EnableDiscoveryClient
@EnableLdapRepositories
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

用户回购:

public interface UserRepo extends LdapRepository<User> {
    List<User> findByFullNameContains(String name);
}

application.yml 的一部分

spring:
    ldap:
        urls: ldap://fr-dc1.groupefdi.priv:389
        base: DC=groupefdi,DC=priv
        username: CN=user,CN=Users,DC=groupefdi,DC=priv
        password: ******

我得到错误:

2017-09-06 14:42:34,551 [ERROR]  --- [http-nio-6546-exec-6] o.a.c.c.C.[.[.[.[dispatcherServlet]:181 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.ldap.PartialResultException: Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '/'] with root cause
javax.naming.PartialResultException: Unprocessed Continuation Reference(s)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2914) ~[na:1.8.0_65]
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888) ~[na:1.8.0_65]
    at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1846) ~[na:1.8.0_65]
    at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769) ~[na:1.8.0_65]
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392) ~[na:1.8.0_65]
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358) ~[na:1.8.0_65]
    at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:276) ~[na:1.8.0_65]
    at org.springframework.ldap.core.LdapTemplate$3.executeSearch(LdapTemplate.java:303) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:363) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:309) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:642) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:578) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.find(LdapTemplate.java:1840) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.findAll(LdapTemplate.java:1806) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.ldap.core.LdapTemplate.findAll(LdapTemplate.java:1814) ~[spring-ldap-core-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.data.ldap.repository.support.SimpleLdapRepository.findAll(SimpleLdapRepository.java:190) ~[spring-data-ldap-1.0.6.RELEASE.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504) ~[spring-data-commons-1.13.6.RELEASE.jar:na]
  .....

我不知道我是否必须在 application.yml 上为 Active Directory 放置一些特殊的东西,或者我是否在某些地方犯了错误。

【问题讨论】:

    标签: java active-directory ldap spring-data spring-ldap


    【解决方案1】:

    在发送请求之前尝试添加:

    ldapTemplate.setIgnorePartialResultException(true);

    更新:

    如果您使用 ldap 存储库,您可以在配置期间设置此标志:

    @Configuration
    @EnableLdapRepositories
    class ApplicationConfig {
    
        @Bean
        ContextSource contextSource() {
    
            LdapContextSource ldapContextSource = new LdapContextSource();
            ldapContextSource.setUrl("ldap://127.0.0.1:389");
    
            return ldapContextSource;
        }
    
        @Bean
        LdapTemplate ldapTemplate(ContextSource contextSource) {
            LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
            ldapTemplate.setIgnorePartialResultException(true);
            return ldapTemplate;
        }
    }
    

    在这种情况下,您将忽略每个 ldap 请求的局部结果异常。

    【讨论】:

    • 谢谢。它删除了异常。但是当我尝试 userRepo.findAll() 时结果是空的
    • @BokC,用户名:CN=user,CN=Users,DC=groupefdi,DC=priv。为什么要定义 CN 两次?
    • 第一个是登录
    • @BokC,请仔细检查用户 DN。可能是您错过了用户角色或其他什么。
    • 我认为 userDn 没问题。 Ma 应用程序与 Active Directory 服务器建立连接。但我认为 Spring-data-ldap 的查询不好。也许我必须更改调用的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多