将用户搜索到 ldap 时出现问题

Posted

技术标签:

【中文标题】将用户搜索到 ldap 时出现问题【英文标题】:Issue while searching user into ldap 【发布时间】:2020-01-21 19:04:43 【问题描述】:

我正在使用在一台服务器上运行的开放式 LDAP,它在 10.0.26.X IP 上运行,我的客户端在 IP 10.0.25.X 和防火墙之间运行,但端口 389 已打开并在听状态。所以我面临的客户端问题是它关闭了客户端服务器,之后我必须每 6 小时重新启动一次客户端,然后它可以正常工作一段时间,然后再次出现同样的问题。

我试图打开我的客户端和打开 LDAP 之间的连接,但同样的问题。 同样从防火墙端我们已经尝试了一切。

Hashtable<String, String> envMap = new Hashtable<>();
    envMap.put(Context.INITIAL_CONTEXT_FACTORY, initContextFactory);
    envMap.put(Context.PROVIDER_URL, providerUrl);
    envMap.put(Context.SECURITY_AUTHENTICATION, securityAuthentication);
    envMap.put(Context.SECURITY_PRINCIPAL, userDN);
    envMap.put(Context.SECURITY_CREDENTIALS, password);
    DirContext userCtx = new InitialDirContext(envMap);

SearchControls controls = new SearchControls();
        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String filter = MessageFormat.format(Constants.LDAP_PERSON_FILTER, attrKey, attrValue);
        NamingEnumeration<SearchResult> userResults = dirReaderctx.search(Constants.LDAP_DOMAIN_NAME,
                filter, controls);
        if (userResults.hasMore()) 
            searchResult = userResults.next();
            return searchResult;
        

我得到的例外是:

[com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:2002), com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844), com.sun.jndi.ldap。 LdapCtx.c_search(LdapCtx.java:1769), com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392), com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java: 358),com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:341),javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267),sun.reflect.GeneratedMethodAccessor100.invoke(未知来源)、sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)、java.lang.reflect.Method.invoke(Method.java:498)、org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod .java:209), org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136), org.springframework.web.servlet.mvc.method.annotation.Se rvletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102), org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877), org.springframework.web.servlet.mvc.method.annotation。 RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783), org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdater.handle(AbstractHandlerMethodAdapter.java:87), org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java: 991), org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925), org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974), org.springframework.web.servlet.FrameworkServlet .doPost(FrameworkServlet.java:877)、javax.servlet.http.HttpServlet.service(HttpServlet.java:661)、org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)、javax.servlet。 H ttp.HttpServlet.service(HttpServlet.java:742), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) , org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193), org.apache.catalina.core.ApplicationFilterChain .doFilter(ApplicationFilterChain.java:166), org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java :107), org.apache.catalina.core.ApplicationFilterChain.inernalDoFilter(ApplicationFilterChain.java:193), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166), org.springframework.web.filter。 OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107), org.apache.cata lina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166), org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java: 99), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193),org.apache.catalina.core.StandardContextValve .invoke(StandardContextValve.java:96)、org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)、org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)、org. apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81), org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87), org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter. java:342), org.apache.coyote.http11.Http11Processor.servi ce(Http11Processor.java:800), org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66),org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800), org.apache.tomcat .utit.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471), org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49), java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624), org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61), java.lang.Thread.run(Thread.java:748)]

【问题讨论】:

那不是异常,那是调用堆栈(不是堆栈跟踪)。有什么例外? 只有这个我从日志中得到。 我觉得这很难相信,但如果是真的,那么您应该修复错误的日志记录代码。 我会打印完整的异常然后它会更有帮助但是ldap连接有什么问题吗?因为我的服务器在相同的跟踪 2.3 次后关闭,然后服务器处于挂起模式,我必须再次重新启动它才能正常工作。 【参考方案1】:

不知道异常,有一点是错误的,就是你没有在NamingEnumeration 上调用close() 方法,所以你在泄漏资源。

如果它工作了一段时间,然后停止工作,这很可能是您遇到的资源耗尽异常。

NamingEnumeration<SearchResult> userResults = dirReaderctx.search(Constants.LDAP_DOMAIN_NAME,
        filter, controls);
if (userResults.hasMore()) 
    searchResult = userResults.next();
    userResults.close(); // <-- add this line
    return searchResult;

【讨论】:

是的,这是内存泄漏。感谢您的输入添加了这一行:userResults.close(); // 【参考方案2】:

在调试了很多东西之后得到了这个问题的答案。 因为我在整个应用程序中只创建一次连接。它在 IP 上的同一子网上工作,因为两者之间没有防火墙。但是当它被移动到不同的子网时,由于连接关闭,这个错误就会出现,因为防火墙关闭了一个代表更长时间的连接。为了解决这个问题,我在需要时创建一个连接请求并汇集相同的连接,因此如果下一个请求出现,如果连接可用于连接池,则使用相同的连接,否则创建新连接并在完成工作后关闭相同的连接. :)

【讨论】:

以上是关于将用户搜索到 ldap 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

连接到 LDAPS(Active Directory)时出现 SSLHandshakeException

尝试搜索 Firestore 并重新加载 tableview 时出现 SearchBar 问题

尝试将广度优先搜索方法写入图形时出现分段错误

将我的复制设置到远程弹性搜索集群时出现问题

搜索控制器处于活动状态时出现表格视图时隐藏的第一行

将模糊搜索与猫鼬一起使用时出现打字稿错误