我需要为应用程序进行 LDAP 身份验证。
我尝试了以下程序:
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
public class LdapContextCreation {
public static void main(String[] args) {
LdapContextCreation ldapContxCrtn = new LdapContextCreation();
LdapContext ctx = ldapContxCrtn.getLdapContext();
}
public LdapContext getLdapContext(){
LdapContext ctx = null;
try{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "Simple");
//it can be <domain\\userid> something that you use for windows login
//it can also be
env.put(Context.SECURITY_PRINCIPAL, "username@domain.com");
env.put(Context.SECURITY_CREDENTIALS, "password");
//in following property we specify ldap protocol and connection url.
//generally the port is 389
env.put(Context.PROVIDER_URL, "ldap://server.domain.com");
ctx = new InitialLdapContext(env, null);
System.out.println("Connection Successful.");
}catch(NamingException nex){
System.out.println("LDAP Connection: FAILED");
nex.printStackTrace();
}
return ctx;
}
}
得到以下异常:
LDAP 连接:失败 javax.naming.AuthenticationException:[LDAP:错误代码 49 - 无效凭据] 在 com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3053) 在 com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2999) 在 com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2801) 在 com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2715) 在 com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:305) 在 com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:187) 在 com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:205) 在 com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:148) 在 com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:78) 在 javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:235) 在 javax.naming.InitialContext.initializeDefaultInitCtx(InitialContext.java:318) 在 javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:348) 在 javax.naming.InitialContext.internalInit(InitialContext.java:286) 在 javax.naming.InitialContext.init(InitialContext.java:308) 在 javax.naming.ldap.InitialLdapContext.(InitialLdapContext.java:99) 在 LdapContextCreation.getLdapContext(LdapContextCreation.java:27) 在 LdapContextCreation.main(LdapContextCreation.java:12)
还有几点需要考虑:
早些时候我正在使用
tomcat 5.3.5
,但有人告诉我只有 tomcat 6 支持它,所以我下载tomcat 6.0.35
并目前只使用这个版本。配置
server.xml
并添加以下代码 -<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" connectionURL="ldap://server.domain.com:389/" userPattern="{0}" />
评论了以下代码
server.xml
-<!-- Commenting for LDAP <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> -->
文章中的步骤 2 和 3
有人建议应该将一些 jar 文件复制到 tomcat 以运行
ldap
身份验证,这是我需要做的吗?以及哪些jar
文件?另外,我肯定使用了正确的凭据,那么导致此问题的原因是什么?
如果我使用不正确的属性,有没有办法找出 LDAP 的正确属性?