从LDAP(Java)检索信息

时间:2013-03-06 11:57:42

标签: java ldap

我正在尝试从LDAP服务器检索数据,但它失败了。 (连接工程)。我很难理解最后一行中search()方法需要哪些参数...... “mail”是我想要获取的信息,userName是经过身份验证的用户。

 DirContext authContext = new InitialDirContext(authEnv);
 SearchControls constraints = new SearchControls();
 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
 NamingEnumeration results = authContext.search("mail", userName, constraints);

这是我的错误消息(出现在最后一行):

 javax.naming.directory.InvalidSearchFilterException: Missing 'equals'; remaining name 'mail'
at com.sun.jndi.ldap.Filter.encodeSimpleFilter(Unknown Source)
at com.sun.jndi.ldap.Filter.encodeFilter(Unknown Source)
at com.sun.jndi.ldap.Filter.encodeFilterString(Unknown Source)
at com.sun.jndi.ldap.LdapClient.search(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.doSearch(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.searchAux(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.c_search(Unknown Source)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(Unknown Source)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)
at javax.naming.directory.InitialDirContext.search(Unknown Source)
at Client.connect(Client.java:48)
at Client.main(Client.java:23)

感谢所有答案,如果我按照要求更改了我的代码,我会收到以下错误:

  javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906E9, 
  comment: In order to perform this operation a successful bind must be completed on the 
  connection., data 0, v1db1

我的连接代码就是这个:

    Properties authEnv = new Properties();
    String userName = "XXX";
    String passWord = "XXX";
    String base = "XXX";
    String dn = "uid=" + userName + "," + base;
    String ldapURL = "XXX";

    authEnv.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
    authEnv.put(Context.PROVIDER_URL, ldapURL);
    authEnv.put(Context.SECURITY_AUTHENTICATION, "none");
    authEnv.put(Context.SECURITY_PRINCIPAL, dn);
    authEnv.put(Context.SECURITY_CREDENTIALS, passWord);

5 个答案:

答案 0 :(得分:2)

如果不了解您的架构,就无法给出确切的答案。

 LdapContext authContext = new InitialLdapContext(authEnv, null);
 SearchControls constraints = new SearchControls();
 String []returnedAttributes = {"mail"};
 String filter = "(userName={0})"; // You might want to limit search to user objects only based on objectClass
 String []filterAttributes = {userName};
 String baseDN = "CN=user,DC=company,DC=org"; // Replace this with the real baseDN
 constraints.setReturningAttributes(returnedAttributes)
 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
 NamingEnumeration<SearchResult> results = authContext.search(baseDN, filter, filterAttributes, constraints);

答案 1 :(得分:2)

您的代码中有几个问题。 您正在使用Active Directory,因此使用uid无法正常工作。 您需要使用CN。

您没有显示您的baseDN,但是您确定知道它是什么吗? 选中“The Hard Part

同样,ldapURL。按照建议操作,获取已知的LDAP浏览器并建立连接。使用Microsoft LIB(或VB)将无法正确显示LDAP通信,因为MS为您做了大量工作。我的current favorite

尝试someone else's code知道可以对抗AD。

答案 2 :(得分:1)

你在这方面做错了:

NamingEnumeration results = authContext.search("mail", userName, constraints);

authContext.search的第一个参数是基础,它应该是您服务器的域

前:

ou=People,dc=google,dc=com

注意:使用一些图形化LDAP浏览器来确定域

答案 3 :(得分:1)

搜索请求至少包含:

  • 基础对象,在该基础对象下面的条目是在搜索结果中返回的候选对象
  • 搜索范围(baseonesub
  • 用于确定在搜索结果中返回哪些候选项的过滤器,例如mail=*(现在),cn=Stack Overflow(相等),cn=Stack*(子串)
  • 要返回的属性列表

参赛作品是退回的候选人:

  • 如果它们位于搜索库之下或之下(搜索范围one除外,其中只返回直接从属于基础对象的条目,但不返回基础对象本身)
  • 过滤器中的断言与条目中的属性值匹配,例如,present过滤器mail=*将匹配具有mail属性的基础对象或其下的所有条目,但对于搜索范围one,如上所述

另见

答案 4 :(得分:1)

检查Oracles教程:http://docs.oracle.com/javase/tutorial/jndi/ldap/jndi.html

在您的示例中,第一个参数应为搜索库,表示您的用户位于目录中的位置,即“ou = people”。第二个是搜索过滤器,在您的示例中可能有一些属性可以与用户匹配。即“sn =”+ userName(&lt; - 应编码)。

“mail”的值应该在结果中,因为这是您想要获取的信息。

另见http://docs.oracle.com/javase/1.6/docs/api/javax/naming/directory/DirContext.html

LDAP并不容易,请尝试找一些好的教程来开始使用。