3

我正在尝试从 LDAP 服务器检索数据,但它失败了。(连接工程)。我很难理解最后一行的 search() 方法中需要哪些参数......“邮件”是我想要获取的信息,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);
4

5 回答 5

3

如果不知道您的架构,就不可能给您准确的答案。

 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);
于 2013-03-06T12:15:37.050 回答
2

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

你没有显示你的 baseDN,但你确定你知道它是什么吗?检查“困难的部分

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

尝试其他人的已知可以对抗 AD 的代码。

于 2013-03-07T11:53:22.863 回答
1

搜索请求至少包括:

  • 基础对象,其下方的条目是搜索结果中返回的候选对象
  • 搜索范围(baseonesub
  • 用于确定在搜索结果中返回哪些候选者的过滤器,例如,mail=*(present)、cn=Stack Overflow(equality)、cn=Stack*(substring)
  • 要返回的属性列表

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

  • 如果它们位于或低于搜索基础(搜索范围除外,one在该范围内仅返回直接从属于基础对象的条目,而不是基础对象本身)
  • 过滤器中的断言匹配条目中的属性值,例如,present过滤器mail=*将匹配位于或低于基础对象的所有条目,这些条目具有除上述mail搜索范围之外的属性one

也可以看看

于 2013-03-06T12:05:54.153 回答
1

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

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

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

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

LDAP 并不容易,试着找一些好的教程开始。

于 2013-03-06T12:06:18.837 回答
1

你在这一行做错了:

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

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

前任:

ou=People,dc=google,dc=com

注意:使用一些图形化的 LDAP 浏览器来找出域

于 2013-03-06T12:04:22.317 回答