我正在尝试从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);
答案 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)
搜索请求至少包含:
base
,one
或sub
)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并不容易,请尝试找一些好的教程来开始使用。