LDAP - ¿Que es el LDAP? - LDAP Java

Hola amigos hoy comenzaremos a ver la utilización de LDAP a través de java, ya que es muy usual utilizar LDAP para la validación de usuarios y la obtención de información de los mismos.

LDAP - ¿Que es el LDAP?



LDAP son las siglas de Lightweight Directory Access Protocol (en español Protocolo Ligero/Simplificado de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación que permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red. LDAP también se considera una base de datos (aunque su sistema de almacenamiento puede ser diferente) a la que pueden realizarse consultas.

Un directorio es un conjunto de objetos con atributos organizados en una manera lógica y jerárquica. El ejemplo más común es el directorio telefónico, que consiste en una serie de nombres (personas u organizaciones) que están ordenados alfabéticamente, con cada nombre teniendo una dirección y un número de teléfono adjuntos. Para entender mejor, es un libro o carpeta, en la cual se escriben nombres de personas, teléfonos y direcciones, y se ordena alfabéticamente.

Un árbol de directorio LDAP a veces refleja varios límites políticos, geográficos u organizacionales, dependiendo del modelo elegido. Los despliegues actuales de LDAP tienden a usar nombres de Sistema de Nombres de Dominio (DNS por sus siglas en inglés) para estructurar los niveles más altos de la jerarquía. Conforme se desciende en el directorio pueden aparecer entradas que representan personas, unidades organizacionales, impresoras, documentos, grupos de personas o cualquier cosa que representa una entrada dada en el árbol (o múltiples entradas).

Habitualmente, almacena la información de autenticación (usuario y contraseña) y es utilizado para autenticarse aunque es posible almacenar otra información (datos de contacto del usuario, ubicación de diversos recursos de la red, permisos, certificados, etc). A manera de síntesis, LDAP es un protocolo de acceso unificado a un conjunto de información sobre una red.

LDAP se maneja con la siguiente estructura.

El protocolo accede a directorios LDAP, que siguen la edición de 1993 del modelo X.500:

  • Un directorio es un árbol de entradas de directorio.
  • Una entrada consta de un conjunto de atributos.
  • Un atributo tiene un nombre (un tipo de atributo o descripción de atributo) y uno o más valores. Los atributos son definidos en un esquema.
  • Cada entrada tiene un identificador único: su Nombre distinguido (Distinguished Name, DN). 




LDAP - LDAP desde Java

Bueno ya vimos arriba que es el LDAP, vemos ahora como utilizarlo/llamarlo desde java.

Vemos la interface Context que contiene varias constantes que utilizaremos para usar el protrocolo LDAP.

La interface Context que utilizaremos se encuentra dentro del package: javax.naming.
Que a su vez esta clase se encuentra en el jar rt.jar que se encuentra en la librería jre.

Veamos finalmente las constantes importantes para hacer el llamado al protocolo LDAP.


  • INITIAL_CONTEXT_FACTORY:  Contiene el string "java.naming.factory.initial", este string representa el nombre del entorno para especificar el contexto inicial del factory usado.
  • PROVIDER_URL: Contiene el string "java.naming.provider.url", este string es el nombre del entorno para especificar la información de la configuración para el service provider usado.
  • SECURITY_AUTHENTICATION: Contiene el string "java.naming.security.authentication", este string representa la propiedad del entorno para especificar el nivel de seguridad del usuario. Dichos valores pueden ser "none", "simple", "strong"
  • SECURITY_PRINCIPAL: Contiene el string "java.naming.security.principal", este string representa la propiedad del entorno para especificar la identidad de las principales autenticaciones para el llamado de los servicios. Es decir el usuario de LDAP. (ver mas adelante atributos LDAP)
  • SECURITY_CREDENTIALS: Contiene el string "java.naming.security.credentials", este string representa la propiedad para las especificaciones de las credenciales de las principales autenticaciones para el llamado de los servicios. Es decir el password de usuario del LDAP. 
Buenos comencemos viendo código

Pongamos las variables iniciales, usuario, password, url del ldap.

static String password = "nicolas99";

static String ldap_url = "ldap://pruebas.ldap.com";

static String username = "uid=nicolas,ou=Users,dc=com,dc=ufo";

Arriba podemos notar la url de username donde vemos una declaración de variables, detallando sin profundidad:
  • uid: Nombre de usuario.
  • ou: Unidad de la organización.
  • dc: Componentes de dominio
(mas abajo veremos la definición del LDIF)

Creemos un Hashtable.

Hashtable<String, String> env = new Hashtable<String, String>(11);

Creado esto ahora llenamos el Hashtable con las constantes de la interface Context y las variables iniciales del LDAP.

Hashtable<String, String> env = new Hashtable<String, String>(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldap_url);
env.put(Context.SECURITY_AUTHENTICATION,"simple");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);

Habiendo seteado las variables del entorno, ahora realicemos la conexión mediante la clase InitialLdapContext, creando una instancia de la misma pasando el Hashtable.

InitialLdapContext ctx = new InitialLdapContext(env, null);

En el caso que la falle la conexión lanzara un excepción NamingException, por lo cual todo el código lo debemos encerrar entre un try y catch.

Y ahora a través del método search realizamos la consulta, el mismo método recibe 3 parámetros:
  1. Es el nombre del contexto o el objeto a buscar.
  2. Es el filtro de la expresion del uso del buscador este no puede ser nulo.
  3. Recibe un SearchControls, en el caso que sea nulo crea uno nuevo.
 NamingEnumeration<?> namingEnum = ctx.search("ou=Users,dc=com,dc=ufo", "(objectclass=person)", null);

Finalmente mediante while recorremo los resultados y obtenemos el "cn" de cada uno de los resultados y los mostramos por pantalla


while (namingEnum.hasMore ()) {

     SearchResult result = (SearchResult) namingEnum.next ();    
     Attributes attrs = result.getAttributes ();
     attrs.getAll().toString();
     System.out.println(attrs.get("cn"));
}

Código completo:

LDAP Java

Bueno en nuestro próximo apunte hablaremos mas de LDAP pero orientado a LDIF ya que es sumamente importante el LDIF.
LDAP - ¿Que es el LDAP? - LDAP Java LDAP - ¿Que es el LDAP? - LDAP Java Reviewed by El lado oscuro de java on marzo 10, 2016 Rating: 5

3 comentarios:

  1. Bro tienes una excelente página pero la interfáz es algo molesta. No puedo leer a gusto por que al hacer scroll o mover el mouse salen eventos JS/JQuery/CCS/Loquesea por doquier que te mueven la página. Creo que deberías controlar más eso. O tal vez solo necesito más práctica con su sitio al que voy a ser asiduo ya que me acaban de contratar como programador Javar Jr y no sé ni una papa.

    Excelente sitio y aportes para lo comunidad

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola, Broda mira no se que decirte el tema de los js y los jquery y css por trato de no tener problema con eso ya que dejo todo en las manos de blogspot, es decir de google asi que no queda otra que habituarte pero vere que puedo hacer! desde ya gracias por pasar y por comentar!!!

      Eliminar
  2. Buenas, no conozco nada de LDAP, y también soy nueva en el ambiente JAVA, estoy queriendo hacer una conexión con esto pero tengo un problema que radica en ésta propiedad de la conexión env.put(Context.SECURITY_PRINCIPAL, username); resulta que los usuarios tienen como cn su nombre completo registrado en el LDAP , he intentado pasar a esta propiedad otros atributos del LDAP como username (SN , userPrincipalName), etc. pero no conecta solo me conecta si le paso el nombre completo del usuario, habría otra propiedad que pueda usar para la conexión??, agradezco desde ya cualquier ayuda.

    ResponderEliminar

Con la tecnología de Blogger.