Como cosa rara siempre uno se consigue la piedrita en el camino. La piedra era que la información que uno consigue en la web funcionaba chevere pero esta vez el ldap con el que se trabajaba posee un sin fin de ramificaciones y la BASE (dn) era diferente para cada grupo de usuarios pertenecientes a una unidad organizativa.
Así que bueno. Aquí les dejo el código que conseguí en la web con algunas modificaciones que permite buscar y autenticar un usuario (uid) contra el LDAP sin necesidad de alguna librería extra (.jar) y perteneciente a cualquier parte del arbol del LDAP.
Espero que les ayude.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package conexionldap; /** * * @author icano */ import java.util.Hashtable; 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.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; public class ValidarPassword { public ValidarPassword(){ } private String url = "ldap://10.XX.XX.XX:389"; private String contexto = "com.sun.jndi.ldap.LdapCtxFactory"; private String tipoAuth = "simple"; public int validarLdap(String login, String password) { int valido = 0; Hashtable<String,String> env = new Hashtable<String,String>(); //UID CONOCIDO Y BASE CONOCIDA PARA PODER CONECTARSE AL LDAP String username = "uid=uid_conocido,ou=Administradores,ou=Usuarios,ou=Cuentas,dc=xxx,dc=xxx"; String password1 = "XXXXX"; env.put(Context.INITIAL_CONTEXT_FACTORY, contexto); env.put(Context.SECURITY_AUTHENTICATION, tipoAuth); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password1); env.put(Context.PROVIDER_URL, url); try { //CONEXION CON EL LDAP DirContext ctx = new InitialLdapContext(env, null); SearchControls searchCtls = new SearchControls(); //ITEMS A TRAER EN EL CASO QUE LO NECESITEMOS String returnedAtts[] = { "uid","sn","givenName","mail"}; searchCtls.setReturningAttributes(returnedAtts); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); String searchFilter = "(uid="+login.toLowerCase()+")"; String searchBase = "ou=Usuarios,ou=Cuentas,dc=xxx,dc=xxx"; NamingEnumeration<SearchResult> results = ctx.search(searchBase, searchFilter, searchCtls); while (results.hasMoreElements()) { SearchResult searchResult = (SearchResult) results.next(); Attributes attrs = searchResult.getAttributes(); //OPTENEMOS LA UNIDAD ORGANIZATIVA DEL UID BUSCADO CON SU UID Y LO COMPLETAMOS CON LA BASE String dn = searchResult.getName()+","+searchBase; if (attrs != null) { //EL UID EXISTE AHORA VALIDAR PASSWORD valido = validarAuth(dn,password); //SI VALIDO ES "0" PASSWORD INCORRECTO, SI ES "1" PASSWORD CORRECTO } } ctx.close(); } catch (NamingException e) { e.printStackTrace(); } //RETORNAMOS EL VALOR A QUIEN LO LLAMO SIENDO POR DEFECTO "0" EN EL CASO DE QUE EL UID NO EXISTA O PASSWORD INVALIDO return valido; } private int validarAuth(String dn,String password){ int valido = 0; Hashtable<String,String> env1 = new Hashtable<String,String>(); env1.put(Context.INITIAL_CONTEXT_FACTORY, contexto); env1.put(Context.SECURITY_AUTHENTICATION, tipoAuth); env1.put(Context.SECURITY_PRINCIPAL, dn); env1.put(Context.SECURITY_CREDENTIALS, password); env1.put(Context.PROVIDER_URL, url); try { DirContext ctx1 = new InitialLdapContext(env1, null); valido = 1; ctx1.close(); } catch (NamingException e) { e.printStackTrace(); } return valido; } }
No hay comentarios:
Publicar un comentario