【问题标题】:searching(selecting) any data from LDAP server using JNDI使用 JNDI 从 LDAP 服务器搜索(选择)任何数据
【发布时间】:2018-11-16 00:46:15
【问题描述】:

我想从我的 LDAP 服务器中选择(搜索)任何类型的数据。 我有一个连接,但我不知道如何检索任何数据。 任何人都可以提供提示,以便我可以查看数据等任何内容吗?

问题:

当我运行以下代码时,我得到了:

线程“main”java.lang.ClassCastException 中的异常:com.sun.jndi.ldap.LdapCtx 无法转换为 javax.activation.DataSource`

我尝试了什么?

DataSource 有两个导入:

  • 1) javax.sql
  • 2) javax.activation

我更改了不同的导入但没有工作。

我的另一个问题是“这两个进口是一样的吗?”

源代码:

public class LDAPJndi {

    //JNDI API를 사용하여 서버와 연결 (Connecting to LDAP server using JNDI)
    public static  DirContext connectJndi() throws NamingException {

        Hashtable<String, String> env = new Hashtable<String, String>(); 
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://192.168.0.60:389");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "cn=govmanager");
        env.put(Context.SECURITY_CREDENTIALS, "GOVmoi!manager");
        DirContext ctx = new InitialDirContext(env); 
        return ctx;
    } 

    public static void lookupJndi() throws NamingException {
        // a method for looking up any data
        DirContext ctx = connectJndi();
        Object o = ctx.lookup("c=kr");
        System.out.println(o);
        //above didn't work, so tried the bottom
        DataSource dataSource = (DataSource) ctx.lookup("c=kr"); //c=kr is BaseDN
        System.out.println(dataSource);
    }
}

【问题讨论】:

  • 我通过使用“SearchControls”“searchFilter”“setSearchScope”“SearchResult”解决了这个问题。谢谢~
  • 您好,如果您认为自己得到了答案,请将其写成带有一些解释的答案并接受它,这样您的帖子就会获得一些可见性,并且遇到相同问题的人可以从中受益。
  • @EricLavault I c。好的。我会的~
  • 你在使用任何框架吗?像 f.e. spring?
  • @user3529850 我正在使用 JNDI API(用于 LDAP 连接)虽然没有 Spring

标签: java ldap jndi


【解决方案1】:

我解决了如下问题。我刚刚添加了许多 cmets 进行实验。它们可能会使某些人感到困惑,因此您可以随意删除它们。而且我认为 Eclipse 推荐的导入在这种情况下是一样的。希望对您有所帮助!

public static  DirContext connectJndi() throws NamingException {

    Hashtable<String, String> env = new Hashtable<String, String>(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://192.168.0.60:389");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "your id");
    env.put(Context.SECURITY_CREDENTIALS, "your password");
    //DirContext ctx = new InitialDirContext(env); 
    LdapContext ctx = new InitialLdapContext(env,null);
    return ctx;
} 


public static void lookupJndi() throws NamingException {
    //DirContext ctx = connectJndi();
    LdapContext ctx = (LdapContext) connectJndi();
    SearchControls ctls = new SearchControls();
    ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
    //ctls.setReturningAttributes(new String[] {"cn"});
    //String searchFilter=String.format("(cn=%s)", "cn" );
    String searchFilter="(objectClass=*)";
    //String searchFilter="(o=*)";

    NamingEnumeration<javax.naming.directory.SearchResult> results
     = ctx.search("c=kr", searchFilter,ctls);
    while(results.hasMoreElements()){
        javax.naming.directory.SearchResult sr = results.next();
        Attributes attrs = sr.getAttributes();
        //System.out.println(sr);
        System.out.println(attrs);
    }   
} // method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多