当前位置: 首页 > 知识库问答 >
问题:

ldapsearch返回命名上下文但JNDI不

晋奕
2023-03-14

如果使用ldapsearch在特定的LDAP服务器上搜索基本级别的命名上下文,则搜索效果良好。

$ ldapsearch -h myhealthisp.com -p 10389 -x -s base -b "" namingContexts
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts
#

#
dn:
namingContexts: dc=myhealthisp,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1`

然而,使用JNDI,我们得到以下响应:

没有结果:myhealthisp.com.问题:[LDAP:错误代码32-没有这样的对象]null

这是我们的代码:

private Attribute getCertFromLdap(SRVRecord srvRec, CertificateInfo certInfo) throws CertLookUpException{
    env.put(DirContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    sc1 = new SearchControls();
    sc1.setSearchScope(SearchControls.ONELEVEL_SCOPE);

try {
        env.put(DirContext.PROVIDER_URL, "ldap://" + targetDomain + ":" + srvRec.getPort());        
        System.out.println("ldap://" + targetDomain + ":" + srvRec.getPort());

        DirContext dc = new InitialDirContext(env);
        NamingEnumeration directoryNE = null;

        System.out.println("Got HERE!");
        directoryNE= dc.search("", "objectClass=*", sc1);

        System.out.println("SC1 :" + sc1);
        while (directoryNE.hasMore()){
                        SearchResult result1 = (SearchResult) directoryNE.next();

            // print DN of entry
            System.out.println("Result.getNameInNamespace: " + result1.getName());
            Attribute foundMail = findMailAttribute(result1.getNameInNamespace()); 

            if(foundMail != null){
                return foundMail;
            }
        }       
        dc.close(); 
} catch (NamingException e) {
    System.out.println("No Results for: " + targetDomain + "\nProblem: " +     e.getLocalizedMessage() + "  " + e.getCause());
} return null;

}

我们能够返回myhealthisp的基本目录的唯一方法。com是通过将目录名(dc=myhealthisp,dc=com)硬编码到基本目录搜索过滤器中(请参阅以下内容了解我们的代码依据:http://directory.apache.org/apacheds/manuals/basic-user-guide-1.5.8-SNAPSHOT/html/ch03s03.html#LDAP操作搜索)

当我们的代码搜索OnTest时。org LDAP服务器,我们得到了每个NamingContext。

以下是onctest.org服务器和myhealthisp.com服务器的Eclipse控制台的输出:

ldap://onctest.org.:10389
Got HERE!
SC1 :javax.naming.directory.SearchControls@4c408bfc
Result.getNameInNamespace: ou=config
Result.getNameInNamespace: dc=example,dc=com
Result.getNameInNamespace: ou=system
Search Result: cn=dts556: null:null:{mail=mail: dts556@onctest.org,     usercertificate=userCertificate: [B@35e06ba6, objectclass=objectClass: organizationalPerson,     person, inetOrgPerson, top, o=o: onctest, sn=sn: Test Case, cn=cn: dts556}

Service Record: _ldap._tcp.onctEst.org. 86400   IN  SRV 0 0 10389 onctest.org.
ldap://myhealthisp.com.:10389
Got HERE!
No Results for: myhealthisp.com.
Problem: [LDAP: error code 32 - No Such Object]  null
Unable to find certificate at LDAP for: steve.tripp@myhealthisp.com
_ldap._tcp.myhealthisp.com. 3600    IN  SRV 0 0 10389 myhealthisp.com.

我们认为是以下原因造成了问题:

  • JDNI无法对OpenLDAProotDSE对象类目录进行基本搜索。

共有2个答案

闾丘昊然
2023-03-14

当搜索级别不是base时,不能出现Root DSE。此外,LDAP客户端不得依赖于根DSE中包含的信息,因为这些属性可能受到访问控制的保护。来自RFC4512:

These attributes are retrievable, subject to access control and other
restrictions, if a client performs a Search operation [RFC4511] with
an empty baseObject, scope of baseObject, the filter
"(objectClass=*)" [RFC4515], and the attributes field listing the
names of the desired attributes.  It is noted that root DSE
attributes are operational and, like other operational attributes,
are not returned in search requests unless requested by name.

将搜索范围更改为base。更好的是,不要编写依赖于从根DSE检索的对象的代码。

  • LDAP:根DSE
仇航
2023-03-14

通常匿名绑定没有权限在根上执行ldap搜索。每个目录都具有匿名绑定和搜索根的OOTB权限。对于apache DS,可以通过ldap查询来搜索命名上下文

ldapsearch-h localhost-p 10389-s base-b”“(objectclass=*)”命名上下文

然而,子树搜索的一级搜索,例如

ldapsearch-hlocalhost-p 10389-s one-b""-D"uid=admin, ou=system"-w秘密"(对象类=*)"

给出以下结果:这是您在jndi程序中执行的操作:ldap\u搜索:无此类对象ldap\u搜索:其他信息:无此类对象:基于SearchRequest的失败DN:“过滤器:'(2.5.4.0=*)”范围:单级类型仅限:错误大小限制:无限制时间限制:无限制删除别名:从不删除别名属性::null

第一个ldapsearch命令的JNDI代码:

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class SampleLDAPSearch {

  private Attribute getCertFromLdap() {
      String targetDomain = "localhost";
      String port = "10389";

      Hashtable env = new Hashtable();
      env.put(DirContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
      SearchControls sc1 = new SearchControls();
      sc1.setSearchScope(SearchControls.OBJECT_SCOPE);
      sc1.setReturningAttributes(new String[] { "namingContexts" });

      try {
          env.put(DirContext.PROVIDER_URL, "ldap://" + targetDomain + ":" + port);

          System.out.println("ldap://" + targetDomain + ":" + port);

          DirContext dc = new InitialDirContext(env);
          NamingEnumeration directoryNE = null;

          System.out.println("Got HERE!");
          directoryNE = dc.search("", "objectclass=*", sc1);

          System.out.println("SC1 :" + sc1);
          while (directoryNE.hasMore()) {
              SearchResult result1 = (SearchResult) directoryNE.next();

              // print DN of entry
              System.out.println("Result.getNameInNamespace: " + result1.getName());
              Attributes attrs = result1.getAttributes();
              Attribute attr = attrs.get("namingContexts");
              System.out.println(attr);

          }
          dc.close();
      } catch (NamingException e) {
          System.out.println("No Results for: " + targetDomain + "\nProblem: " + e.getLocalizedMessage() + "  "
                  + e.getCause());
      }
      return null;

  }

  public static void main(String[] args) {
      SampleLDAPSearch sls = new SampleLDAPSearch();
      sls.getCertFromLdap();
  }
}
 类似资料:
  • 注意,这对我没有帮助Tomcat错误:警告:无法检索容器的JNDI命名上下文 当我在新的工作区上运行Apache tomcat V8.0服务器时,它会产生一个“服务器tomcat V8.0 server at localhost启动失败”。错误。 2016年8月19日上午8:50:33 org.apache.coyote.abstractProtocol destroy Info:Destroci

  • Spark 1.3.1(也尝试了Spark 1.5.1) Hadoop 2.6(在CDH 5.4.0上) Pyspark--主纱--num--执行者5--执行者-内存10g--驱动程序-内存4g--驱动程序-核心4 database.table有超过2k个分区 database.table在field1上分区(在where子句中使用) 占用的时间不确定--我不得不停止查询的执行,因为它很快占用了我

  • 我在过去的两个小时里一直在试图解决这个问题。试过很多东西。 该片段似乎正在向我的适配器传递空上下文。我尝试在onCreate和onCreateView和onActivityCreated中初始化上下文变量。同样的结果。

  • 问题内容: 问题是我需要先移动文件,然后其余逻辑才能工作,因此当方法返回false时,我将停止执行。 但是,当我在Windows资源管理器中检查文件时,它具有一个新名称,并且已移动。 只是好奇为什么会这样。 这是一些我刚刚尝试重新创建问题的示例代码。这几乎是同一件事,并且工作正常。 编辑:解决了。很抱歉浪费大家的时间这么愚蠢的事情。但是,我真的不认为如果没有发布此帖子,我不会对此进行追踪。 解决的

  • 问题内容: 我用如下猫鼬定义了一个模型: 然后创建了一个用户,可以通过mongo控制台完美地找到它,如下所示: 但是,当我尝试通过带有mongoose的node.js访问此对象时,要检索的对象不是此类文档,而是包装器: 这段代码… 从console.dir(doc)产生此输出… 因此,密码将不匹配,因为doc.password未定义。 为什么会这样呢? 问题答案: 这正是包裹猫鼬对象的猫鼬的目的。

  • 函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。 如果命名了返回值参数,一个没有参数的return语句,会将当前的值作为返回值返回。注意,如果遇到if等代码块和返回值同名,还需要显示写出返回值。 package main import "fmt" func split(sum int) (x, y int) { x = sum *