jueves, 31 de marzo de 2011

Autenticación LDAP con JAVA

Bueno esta vez me toco autenticar cualquier usuario contra el LDAP con JAVA.

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: