Configuración y acceso a OpenLdap desde Java con JNDI

0
44555

Instalación, carga y consulta de OpenLDAP

 

Objetivo

Esta guía tiene como objetivo mostrar
todos los pasos necesarios para la instalación y puesta en marcha de un
servidor OpenLDAP (esto no esta demasiado bien dicho..pero bueno) asi
como su acceso desde un programa Java.

No
intenta explicar los conceptos…ya que si tienes que montar esto….se
entiende que ya tienes un conocimiento moderado de esta tecnologías.

Los
pasos son relativamente simples:

Codigo: Código Java

 

 

Ir a 
http://www.openldap.org/
y el apartado Download te llevará a un
punto de descarga

Una vez descargado, la
aplicación tiene una extructura de ficheros como la siguiente

 

 


Podemos compilarlo o bien usar una distribución copilada como la que podemos encontrar en http://www.fivesight.com

Instalarlo (desde la version compilada) es tan sencillo, como descomprimirlo

 

Probablemente, nos
encontremos algún problema al arrancarlo….. por lo que es mejor hacer un
script
arranca.bat

 

SET SYSCONFDIR
C:\java\LDAP\openldap-2_0_19_no_debug
ECHO %SYSCONFDIR%
slapd
pause
 

El punto más
importante, es el fichero de configuración
slapd.conf

 

# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.8.8.7 2001/09/27 20:00:31 kurt Exp $
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include C:\\java\\LDAP\\openldap-2_0_19_no_debug\\schema\\core.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org

pidfile %LOCALSTATEDIR%/slapd.pid
argsfile %LOCALSTATEDIR%/slapd.args

# Load dynamic backend modules:
# modulepath %MODULEDIR%
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la

#
# Sample Access Control
# Allow read access of root DSE
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
#
#access to dn=»» by * read
#access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default is:
# Allow read by all
#
# rootdn can always write!

#######################################################################
# ldbm database definitions
#######################################################################

database ldbm
#suffix «dc=rcanales,dc=com»
#suffix «o=casa,c=US»
#rootdn «cn=Manager,dc=rcanales,dc=com»
#rootdn «cn=Manager,o=casa,c=US»

suffix «o=casa«
rootdn «cn=root,o=casa«
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw roberto
# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd/tools. Mode 700 recommended.
directory C:\\java\\LDAP\\openldap-2_0_19_no_debug\\casa

# Indices to maintain
index objectClass eq

#Añadido
schemacheck off

 

El primer error que nos
podemos haber encontrado…. posiblemente sean las barras de path

C:\\java\\LDAP\\openldap-2_0_19_no_debug\\schema\\core.schema

 

No olvidar crear el
directorio, en este caso
«casa«

 

Ahora, añadir
elementos, para ello usaremos un fichero LDIFF

dn: o=casa
objectclass: top
objectclass: organization
o:casa

dn: cn=root, o=casa
objectclass: person
objectclass: top
cn:root
sn:SinApellido

dn: o=desarrollo, o=casa
objectclass: top
objectclass: organization
o:desarrollo

dn: ou=front, o=desarrollo, o=casa
objectclass: top
#objectclass: organization
objectclass: organizationalUnit
ou: front

dn: cn=Roberto, ou=front, o=desarrollo, o=casa
objectclass: top
#objectclass: organization
#objectclass: organizationalUnit
objectclass: person
cn:Roberto
sn:Canales
#mail:roberto_canales@hotmail.com

 

Con el comando (addelemento.bat)

slapadd -v -f slapd.conf -l prueba.ldif
pause

 

Y el resultado es

 

Si queremos ver ahora
el resultado, con un navegador de LDAP, podemos descargarnos uno
gratuito, por ejemplo 

Softerra LDAP Browser

 

La estructura básica,
ya la hemos visto…… lo más importante, es comprender la naturaleza
de un LDAP

El LDAP es un interfaz, optimizado para
acceso de lectura, a un sistema que almacena datos jerarquizados… o
algo asi 🙂

Es decir, lo importante, es tener clara la jerarquía de los datos (y
los propios datos) que se quieren almacenar .

Hay que tener en cuenta, que normalmente, un servidor LDAP (que tiene
un interfaz LDAP) 

es único en una organización y que se accederá a
él desde distintas aplicaciones y lenguajes.

Nosotros vamos a acceder desde el lenguaje Java …. y existen varios
medios para acceder, los cuales condicionan o no que la información que
introducimos, sea posteriormente manipulada por programas Java 

 

Configuración del
entorno Java

Para acceder a cualquier tipo de servidor
desde JAva, (casi) siempre existen varios sistemas, APIs nativas o
interfaces estandar.

Para acceder a un servidor LDAP, el sistema más recomendable es
utilizar el mecanismo estandar JNDI.

Para poder acceder via JNDI, hay que descargarse un Provider
….(buscar LDAP provider)

Es un fichero con
extensión jar que hay que meter en el classpath (variable de
entorno)

 

 

El modo más sencillo
de aprender lo recesario, es descargarse de SUN el tutorial de JNDI

 

 

 

Programa mínimo Java
(con editor GEL) … se da por hecho que se tiene instalado un jdk
…. 

/********************************************************************
*

 Programa minimo de acceso a LDAP
*********************************************************************/
import java.util.*;
import java.io.*;
import javax.naming.*;
import javax.naming.ldap.*;
import javax.naming.directory.*;

class ldapminimo
{
 InitialDirContext ctx = null;

 public void depura(String cadena) // codigo para unificar salidas
 {
     System.out.println(cadena);
 }

 public static void main(String[] args) // punto de entrada a la aplicacion
 {
     ldapminimo instancia = new ldapminimo();
     instancia.ejecuta(); // evitamos instranciacion estatica de los metodos

 }

 public void ejecuta()
 {
     String target = «»;

     Properties env = System.getProperties();

     env.put(Context.INITIAL_CONTEXT_FACTORY, «com.sun.jndi.ldap.LdapCtxFactory»);
     env.put(Context.PROVIDER_URL, «ldap://localhost:389/ou=front,o=desarrollo,o=casa»);
     env.put(Context.SECURITY_PRINCIPAL, «cn=root,o=casa»);
     env.put(Context.SECURITY_CREDENTIALS, «roberto»);

  try
  {
     ctx = new InitialDirContext(env);
     depura («El DN es: » + ctx.getNameInNamespace());
    
//muestraLista(target,
ctx.list(target));

     ctx.close();
  }
  catch (Exception e)
  {
     depura(«Excepcion EN BUCLE PRINCIPAL»);
     e.printStackTrace();
  }

 }

}

 

Este es el aspecto del GEL….pero el editor es lo de
menos…..sea el que sea…no se te olvide que tiene que encontrar en la
varaible de entorno CLASS_PATH los ficheros jar del jsdk de Java y del
Provider LDAP de JNDI  

Cualquier error en la compilación….cuanto nos
apostamos a que es por esto? 🙂

 

Descomentamos la linea en rojo    
//muestraLista(target,
ctx.list(target));


// para el DN que se pone en PROVIDER_URL, recorre todos los elementos
void muestraLista(String msg, NamingEnumeration nl)
{
     System.out.println(«Sacamos lista de elementos para: » + msg);

     if (nl == null)
     {
       System.out.println(«No hay Elementos en la lista»);
     }
     else
     {
       try
       {
             
// recorrer la enumeracion
             
while (nl.hasMore())
             
{
             
Object objeto = nl.next();
             
NameClassPair parNombre = null;

             
depura(«Detalle del Objeto» + objeto.getClass().getName());

             
// nos aseguramos que es objeto del tipo adecuado
             
if (objeto instanceof javax.naming.NameClassPair)
             
{
                    
// depura («Es un javax.naming.NameClassPair»);
                    
parNombre = (NameClassPair) objeto;
             
}
             
else
             
{
                    
depura(«No es un nombre»);
                    
return;
             
}

             
// Cojer el nombre
             
String nombre = parNombre.getName();
             
depura(«El nombre recogido es » + nombre);

             
// listaAtributos(ctx,nombre);

             
}
       }
       catch (NamingException e)
       {
             
e.printStackTrace();
       }
    }

}

 

Y la salida es

 

Si añadimos con el
LDIFF otra entrada (hay que tirar el LDAP para ver los cambios)

dn: cn=Pedro, ou=front, o=desarrollo, o=casa
objectclass: top
#objectclass: organization
#objectclass: organizationalUnit
objectclass: person
cn:Pedro
sn:Picapiedra
#mail:pedro_picapiedra@hotmail.com

 

Ejecutamos de nuevo el
programa

 

Queremos ver ahora la
lista de atributos, Descomentamos la linea en rojo 

// listaAtributos(ctx,nombre);

void listaAtributos (DirContext localContext, String cadena)
{
     try
     {
          // se puede mejorar pasandole un array con el nombre de los atributos a recoger
          Attributes attr =
localContext.getAttributes(cadena);

          // recuperamos una enumeracion con todos los atributos
          NamingEnumeration nl =
attr.getAll();

          if (nl == null)
          {
              
depura(«lista de atributos nula»);
              
return;
          }

          while (nl.hasMore())
          {
              
Object objeto = nl.next(); // recorremos todos los tributos

              
if (objeto instanceof Attribute)
              
{
                   
// cojemos un atributo especifico
                   
Attribute internalAttr = (Attribute)objeto;
                   
depura(«\tAtributo = » + objeto.toString());
              
}
          }
     }
     catch (NamingException e)
     {
          e.printStackTrace();
     }
}

 

Si has tenido problemas …. escribeme y dime
cuales….aunque es casi …casi seguro que son problemas con classpath
de Java

Ultimo cambio 16/12/2002 23:01:34

Dejar respuesta

Please enter your comment!
Please enter your name here