Necesito hacer Autenticación LDAP para una aplicación.Autenticación LDAP usando Java
He probado el siguiente programa:
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, "[email protected]");
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;
}
}
Conseguir siguiente excepción:
LDAP Connection: FAILED javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials] at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3053) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2999) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2801) at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2715) at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:305) at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:187) at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:205) at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:148) at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:78) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:235) at javax.naming.InitialContext.initializeDefaultInitCtx(InitialContext.java:318) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:348) at javax.naming.InitialContext.internalInit(InitialContext.java:286) at javax.naming.InitialContext.init(InitialContext.java:308) at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:99) at LdapContextCreation.getLdapContext(LdapContextCreation.java:27) at LdapContextCreation.main(LdapContextCreation.java:12)
cuantos más puntos a considerar:
Anteriormente yo estaba usando
tomcat 5.3.5
pero alguien me dijo que solo Tomcat 6 sup lo conecta, así que descarguétomcat 6.0.35
y actualmente solo uso esta versión.Configurado
server.xml
y añade el siguiente código -
<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" connectionURL="ldap://server.domain.com:389/"
userPattern="{0}" />
comentado el siguiente código de
server.xml
-<!-- Commenting for LDAP <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> -->
Pasos 2 y 3 de article
Alguien sugirió que hay algunos archivos jar que se supone que se va a copiar a Tomcat con el fin de ejecutar
ldap
autenticación, es que algo que tengo que hacer? ¿Y qué archivosjar
?Además, estoy usando las credenciales correctas, ¿cuál es la causa del problema?
¿Hay alguna manera de averiguar los atributos correctos para LDAP en caso de que esté utilizando los incorrectos?
Hay mejores bibliotecas para esto, pero aquí es una pregunta similar http://stackoverflow.com/a/12165647/1286621 Estoy de acuerdo con @jasim acerca del principal. Necesita averiguar qué formato está usando su servidor LDAP. Aquí hay un ejemplo de mi servidor de Active Directory "CN = bindUserName, CN = Users, DC = myDepartment, DC = myNetwork". La gente de LDAP debería poder decirle rápidamente cuál es el formato. También hay herramientas de GUI que pueden conectarse a LDAP y explorar los directorios. Habla primero con tus administradores. – Mike
Solo un comentario más, ¿sabe usted que generalmente hay un usuario/contraseña "Enlace", uno que tiene permiso para buscar información en el Servidor LDAP? Una vez que enlaza al servidor, puede autenticar las credenciales de los usuarios. – Mike