Tengo una aplicación web, donde los usuarios deben iniciar sesión. La contraseña se almacena en un servidor LDAP. Toda la información sobre el servidor LDAP se almacena en el servidor de aplicaciones (glassfish) como recurso jndi externo. Así que mi aplicación no sin saber nada sobre el servidor LDAP y sólo consigue un LdapContext así:¿Cómo verificar la contraseña del usuario en ldap con java con LdapContext dado?
@Resource(name = "ldap/users")
private LdapContext ctx;
Con este contexto, es fácil cambiar o leer la información almacenada por los usuarios, pero ¿cómo puedo comprobar sus contraseñas ? Normalmente solo haría una nueva conexión para verificar la contraseña de un usuario. De esta manera:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");
DirContext ctx = new InitialDirContext(env);
Pero como no conozco estos parámetros no puedo hacer esto. Entonces, ¿cómo puedo verificar si la contraseña de un usuario es correcta con mi LdapContext? Las contraseñas se almacenan encriptadas (ssha) por lo que no puedo simplemente comparar los atributos.
Gracias Raffael
Hola Nikolay, también creo que este es el método preferido, ya que puede buscar correctamente a los usuarios por diferentes criterios. Intenté esto sin embargo y recuperar el atributo 'distinguishedName' siempre devuelve' null'. Creo que es una mejor opción para usar 'resultado.getNameInNamespace() ', ¿qué piensas? – maxdev
Hola Max, gracias por refinar mi solución. Con respecto a la obtención de un DN, creo que puede depender del proveedor del servicio LDAP. En mi caso, hace 5 años, en el clásico Microsoft AD LDAP funcionó a través del atributo de extracción 'attrs.get (" distinguishedName ")'. –