SpringLDAP

Con la liberación de la versión 1.0.0 de OpenDS he decidio retomar mis pininos con SpringLDAP.

Tenia instalado OpenLDAP, pero por estar sobre Windows, a veces me daba problemas; cosa que hasta el momento no me ha pasado con OpenDS.

La instalación resulto de lo más sencillo gracias a que se puede realizar via java web start.

 Una vez instalado, la consola tiene el siguiente aspecto:

Panel de estado de OpenDS

 

Para navegar dentro del arbol LDAP, siempre he utilizado LDAP Browser.

Consola LDAP Browser

El tutorial de SpringLDAP esta muy completo.

Sólo necesitamos definir un par de beans en el contexto:

    <bean id="contextSource"
        class="org.springframework.ldap.core.support.LdapContextSource">
        <property name="url" value="ldap://0.0.0.0"    />        
        <property name="base" value="dc=albatros,dc=org"    />
        <property name="userDn" value="cn=Directory Manager"    />
        <property name="password" value="secreto"    />
    </bean>

    <bean id="ldapTemplate"
        class="org.springframework.ldap.core.LdapTemplate">
        <constructor-arg ref="contextSource"    />
    </bean>
   <bean id="personDao" class="org.eolos.ldap.core.dao.impl.PersonDaoImpl">
      <property name="ldapTemplate" ref="ldapTemplate"    />
   </bean>    

Cargar los jars adecuados:

  • commons-lang.jar
  • commons-logging.jar
  • commons-pool.jar
  • ldapbp.jar
  • spring-beans.jar
  • spring-context.jar
  • spring-core.jar
  • spring-dao.jar
  • spring-jdbc.jar
  • spring-ldap-1.2.1.jar

 

Y probar el código:

 

import org.eolos.ldap.core.dao.impl.PersonDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.ldap.core.support.LdapContextSource;

public class TestConn {
    
    public static void main(String [] argv){
        
        ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
        PersonDaoImpl pdi = (PersonDaoImpl)context.getBean("personDao");
        System.out.println("Lista de usuarios "+ pdi.getAllPersonNames());
        System.out.println("Terminado");        
    }
}

 

El resultado es:

Lista de usuarios [rugi, demiurgo]
Terminado

Adjunto los siguientes archivos por si quieren probar:

  • applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
    - Middle tier application context definition for the image database.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <bean id="contextSource"
        class="org.springframework.ldap.core.support.LdapContextSource">
        <property name="url" value="ldap://0.0.0.0"    />        
        <property name="base" value="dc=albatros,dc=org"    />
        <property name="userDn" value="cn=Directory Manager"    />
        <property name="password" value="secreto"    />
    </bean>

    <bean id="ldapTemplate"
        class="org.springframework.ldap.core.LdapTemplate">
        <constructor-arg ref="contextSource"    />
    </bean>
   <bean id="personDao" class="org.eolos.ldap.core.dao.impl.PersonDaoImpl">
      <property name="ldapTemplate" ref="ldapTemplate"    />
   </bean>    
</beans>
  • PersonDao
package org.eolos.ldap.core.dao;

import java.util.List;

public interface PersonDao {
    public List getAllPersonNames() ;
}

  • PersonDaoImpl
package org.eolos.ldap.core.dao.impl;
import java.util.List;

import javax.naming.directory.Attributes;

import org.eolos.ldap.core.dao.PersonDao;
import org.springframework.ldap.NamingException;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.filter.AndFilter;
import org.springframework.ldap.filter.EqualsFilter;

public class PersonDaoImpl implements PersonDao {
       private LdapTemplate ldapTemplate;

       public void setLdapTemplate(LdapTemplate ldapTemplate) {
          this.ldapTemplate = ldapTemplate;
       }
       
       public List getAllPersonNames() {
          return ldapTemplate.search(
             "", "(objectclass=person)",
             new AttributesMapper() {
                public Object mapFromAttributes(Attributes attrs)
                        throws javax.naming.NamingException {
                     return attrs.get("cn").get();                    
                }
             });
       }}

 

  • TestConn
package org.eolos.ldap.core.test;

import org.eolos.ldap.core.dao.impl.PersonDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.ldap.core.support.LdapContextSource;

public class TestConn {
    
    public static void main(String [] argv){
        
        ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
        PersonDaoImpl pdi = (PersonDaoImpl)context.getBean("personDao");
        System.out.println("Lista de usuarios "+ pdi.getAllPersonNames());
        System.out.println("Terminado");        
    }
}

 El tutorial de la página del proyecto trae un ejemplo más completo, pero, creo que se puede iniciar con algo sencillo.

Saludos!!

RuGI

Isaac Ruiz Guerra.

 

 

AdjuntoTamaño
OpenDS_console.jpg59.24 KB

Help me con LDAP

Hola estoy intentado hacer la parte de login de una aplicación Web con LDAP  y me estoy basando en este ejemplo que publicaste pero tengo la siguiente duda:

Tenemos tres servidores de LDAP (desarrollo, QA, Produccion) mi intención es dejar parametrizable el servidor LDAP pero no se como, lo primero que se me ocurre es definir los tres beans con los datos de los tres servidores

 <bean id="contextSourceDEV" class="org.springframework.ldap.core.support.LdapContextSource" ....>
 <bean id="contextSourceQA" class="org.springframework.ldap.core.support.LdapContextSource" ....> y produccion

 Pero no quisiera que se crearan las tres instancias(ya que pienso que esto le puede pegar al performance, es correcto?) solo una , la que corresponda (DEV, QA o produccion) pero como le digo a Spring ahorita creame una y cuando estemos en otro ambiente crea otra sin cambiar los XML?

Y como inyecto la corecta a mi Service??  o debo inyectar las tres?? 

espero haberme explicado y se pueda hacer lo que necesito... De antemano graciasss