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;
}
}

lunes, 23 de agosto de 2010

Como capturar Mac Address de Cliente

Bueno señores escribo del tema porque como cosa rara al principio me parecio algo sencillo pero cuando lo comence hacer no fue así.

Para capturar la Mac Address de los clientes que visitan tu aplicación lo hice con JAVA.

Hay que tomar en cuenta que la Mac no viaja por ninguno de los protocolos de la red,  como TCP/IP.  Y tampoco se encuentra en la cabecera de la información que viaja por tu pagina Web.

Entonces como capturamos la Mac Address del cliente que nos visita???

En la red hay mucha información tal es el caso de algunas paginas como esta:

http://www.kodejava.org/examples/250.html

o esta

http://www.easywayserver.com/forum/viewtopic.php?t=1241

Pero a mi ninguna me sirvio

Las opciones de esos link los probe pero solo funcionan para obtener la mac address del servidor donde se aloja el contenedor de nuestra aplicación más no la del cliente.

Tambien existe otra forma que es con ActiveX Control pero solo funciona con IE y el cliente tendria que habilitar opciones que violan niveles de seguridad  en su navegador. Y como solo funcionaba con IE y mis clientes son de 80% software libre esa opción no es un camino.

Bueno la solución la consegui.... la mac address se encuentra en la capa 2 del modelo OSI y no la podemos leer tan facilmente del cliente y mucho menos sin autorización.

Los pasos resumidamente son:
Paso 1:
El cliente debe tener instalado un plugin de Java (JRE) Este debe ser JRE 6u20 si es otra versión no se garantiza que funcione.
Y se puede verificar aquí:

http://www.java.com/es/download/installed.jsp

Y nuestra pagina debe verificar si lo tiene instalado.

Se puede hacer con el siguiente codigo Javacript:

var L = navigator.plugins.length;
var exis = 0;
for(var i=0; i<L; i++) {   
switch(navigator.plugins[i].name)
{
    case "Java(TM) Platform SE 6 U20": //Para SO basados en Windows
        exis = 1;
    break;
    case "Java(TM) Plug-in 1.6.0_20":  //Para SO basados en Debian
        exis = 1;
    break;
    case "IcedTea NPR Web Browser Plugin (using IcedTea6 1.7.3(suse-2.1.1i386))": //Para SO basados en Slackware
        exis = 1;
    break;
    case "IcedTea Java Web Browser Plugin": //Para SO basados en Red Had
        exis = 1;
    break;
}
}

Si exis es igual a 0 el cliente no tiene instalado el plugin, si es 1 el cliente lo tiene instalado.

Paso 2:

Descargue el siguiente archivo que contiene los ejemplos y el codigo fuente:

http://www.softwaresamurai.com/Agwego/mac/macaddressapplet-1.0.tar.gz 

Una vez descargados los descomprimen sea cual sea el caso en linux o windows busque como descomprimirlos.

Paso 3:
Luego adapte mi aplicación a lo que descargue.

colocando el siguiente codigo en el body

<embed type="application/x-java-applet"
           name="macaddressapplet"
           width="0"
           height="0"
           code="MacAddressApplet"
           archive="macaddressapplet.jar"
           pluginspage="http://java.sun.com/javase/downloads/index.jsp"
           style="position:absolute; top:-1000px; left:-1000px;">
        <noembed>
            <object classid="clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA"
                    type="application/x-java-applet"
                    name="macaddressapplet"
                    style="position:absolute; top:-1000px; left:-1000px;">
                <param name="code" value="MacAddressApplet"/>
                <param name="archive" value="macaddressapplet.jar" />
                <param name="mayscript" value="true"/>
                <param name="scriptable" value="true"/>
                <param name="width" value="0"/>
                <param name="height" value="0"/>
              </object>
        </noembed>
    </embed>

<script type="text/javascript">
        function getMacAddressesJSON1()
            {
                document.macaddressapplet.setSep( ":" );
                document.macaddressapplet.setFormat( "%02x" );
                var macs = eval( String( document.macaddressapplet.getMacAddressesJSON() ) );
                var mac_string = "";
                for( var idx = 0; idx < macs.length; idx ++ )
                    mac_string += "\t" + macs[ idx ] + "\n ";
                document.getElementById("txtMACAdress").value = mac_string;               
            }
      
       </script>

Las primeras lineas son para importar las librerias necesarias para el uso de las funciones que descargamos.


Y las ultimas llama a la función getMacAddressesJSON1 me trae las mac address del cliente incluyendo mac de maquinas virtuales que pudiera tener el cliente. Guardando los datos en un input de tipo texto "tXtMACAdress"


Y guala con el dato en un input puedo utilizarlo para lo que se desee...

Cualquier pregunta escribame y con gusto los ayudaré...


Espero sus comentarios a ver si me motivo a escribir de diferentes temas tecnológicos...