Java 使用JNDI的LDAP身份验证

Java 使用JNDI的LDAP身份验证,java,ldap,jndi,Java,Ldap,Jndi,我想测试给定的用户和LDAP用户的密码是否正确 我整理出jndi是要使用的库 我发现这个简单的类: package myldap; import java.util.Hashtable; import javax.naming.AuthenticationException; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; impor

我想测试给定的用户和LDAP用户的密码是否正确

我整理出jndi是要使用的库

我发现这个简单的类:

package myldap;

import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
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;


// boolean function to test user and pwd
public static boolean userVerify(String user, String password){
boolean userVerify = false;
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://192.168.48.10");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "CN=" + user + ",conn");
env.put(Context.SECURITY_CREDENTIALS, password);

try {
DirContext authContext = new InitialDirContext(env);
userVerify = true;
authContext.close();
} catch (AuthenticationException authEx) {
//("Authentication Exception!");
userVerify = false;
} catch (NamingException namEx) {
//("Something went wrong!");
userVerify = false;
} 
return userVerify;
}
因为我试图让它工作,所以我在玩弄参数。 我在函数中输入的值是

INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
PROVIDER_URL, "ldap://192.168.48.10");
SECURITY_AUTHENTICATION, "simple");
SECURITY_PRINCIPAL, "CN=" + user + ",conn");
SECURITY_CREDENTIALS, password);
通过以上操作,我得到了
AuthenticationException
,这是我所能达到的最佳结果,通过更改我得到的
NamingException
,因此我似乎不太接近解决方案

特别是我对
安全性原则不太清楚


是否有人有经验并能就如何正确传递这些值提供建议,以确定哪些值是错误的?当然,我希望连接,而不是引发异常。

安全主体需要是您正在进行身份验证的用户的整个DN


通常,您必须使用用户的某些独特属性(如其电子邮件地址)对DIT进行事先搜索才能找到,并且通常您必须作为DIT中内置的具有搜索权限的其他管理用户进行身份验证。然后,当您找到DN时,您可以更改安全原则并重新连接。

谢谢您的回复。你是说安全性原则应该像“CN=john,OU=ACME用户,OU=OU-ACME内部,DC=ACME,DC=acmesystems,DC=com”?如果我只需要传递用户名,如“john@acme“我该怎么办?我想我已经回答了。您使用的是什么LDAP服务器?