Inicio > Java, ldap, Linux > CRUD de usuarios en el servidor LDAP + JAVA

CRUD de usuarios en el servidor LDAP + JAVA

mayo 26, 2009

En esta clase se va a realizar una clase completa para realizar una búsqueda, inserción, eliminación y modificación de los datos de los usuarios de un servidor LDAP desde el lenguaje de programación JAVA, al final de este post se pondrá el link para descargar el proyecto completo para que les quede como referencia de como es que yo lo hice, espero que les sirva, ojala puedan mejorar este código espero que lo compartan para poder ir aprendiendo todos…

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPModification;
import com.novell.ldap.LDAPSearchResults;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author christian
*/

public class CRUD {
     private Conexion conLDAP = new Conexion();
     private LDAPConnection lc = new LDAPConnection();
     
     /**
     * Metodo paraañadir un nuevo usuario, la persona que realice esta
     * transaccion debe tener los permisos para
     * @param strUIDManager
     * @param strPass
     */

     public void Añadir(String strUIDManager, String strPass) {
          try {
               LDAPEntry usuario = Datos();
               lc = conLDAP.ConexionManager(strUIDManager, strPass);
               lc.add(usuario);
               conLDAP.CerrarConLDAP(lc);
               System.out.println("Usuario
               Ingresado Correctamente...");
          } catch(LDAPException ex) {
               if (ex.getResultCode() == 68) {
                    System.err.println("ERROR:El Usuario ya se encuentra ingresado...");
               }
              Logger.getLogger(CRUD.class.getName()).log(Level.SEVERE,null, ex);
          }
     }

     /**
     * Datos del  usuario a ser Ingresado
     * @return LDAPEntry
     */

     public LDAPEntry Datos() {
          LDAPAttributeSet setAtr = new LDAPAttributeSet();
          setAtr.add(new LDAPAttribute("objectclass", new String("person")));
          setAtr.add(new LDAPAttribute("objectclass", new String("organizationalPerson")));
          setAtr.add(new LDAPAttribute("objectclass", new String("inetOrgPerson")));
          setAtr.add(new LDAPAttribute("objectclass", new String("posixAccount")));
          setAtr.add(new LDAPAttribute("objectclass", new String("top")));
          setAtr.add(new LDAPAttribute("userpassword", new String("newpassword")));
          //setAtr.add(new LDAPAttribute("uidnumber", new String("555")));
          setAtr.add(new LDAPAttribute("givenname", new String("Jim")));
          //setAtr.add(new LDAPAttribute("loginshell", new String("/dev/null")));
          //setAtr.add(new LDAPAttribute("gecos", new String("arroyo carvache carlos")));
          setAtr.add(new LDAPAttribute("gidNumber", new String("100")));
          setAtr.add(new LDAPAttribute("sn", new String("Smith")));
          setAtr.add(new LDAPAttribute("cn", new String("Jim Smith")));
          setAtr.add(new LDAPAttribute("mail", new String("JSmith@Acme.com")));
          //setAtr.add(new LDAPAttribute("homeDirectory", new String("/public/centros/carroyo")));
          setAtr.add(new LDAPAttribute("telephonenumber", new String("1 801 555 1212")));
          String dn = "uid=jsmith,ou=People,o=utpl,c=ec";
          LDAPEntry newEntry = new LDAPEntry(dn, setAtr);
          return newEntry;
     }

     /**
     * Metodo para buscar un usuario dentro del servidor LDAP
     * Filtro es el username a buscar
     * @param LDAPConnection lc
     * @param String strFiltro
     */

     public void Buscar(String strUser, String strPass, String strFiltro) {
          String filtro;
          LDAPSearchResults searchResults;
          String searchBase = "o=utpl,c=ec";
          int searchScope = LDAPConnection.SCOPE_SUB;
          filtro = "(uid=" + strFiltro + ")";
          try {
               lc = conLDAP.ConexionUser(strUser, strPass);
               searchResults = lc.search(searchBase, searchScope, filtro, null, false);
               //Recorre Todos los Usuarios de la Base
               while (searchResults.hasMore()) {
                    LDAPEntry nextEntry = null;
                    try {
                         nextEntry = searchResults.next();
                    } catch (LDAPException e) {
                         System.out.println("Error: " + e.toString());
                         continue;
                    }
                    LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
                    Iterator allAttributes = attributeSet.iterator();
                    //Recore los atributos del usuario
                    while (allAttributes.hasNext()) {
                         LDAPAttribute attribute = (LDAPAttribute) allAttributes.next();
                         String attributeName = attribute.getName();
                         Enumeration allValues = attribute.getStringValues();
                         if (allValues != null) {
                              while (allValues.hasMoreElements()) {
                                   String value = (String) allValues.nextElement();
                                   System.out.println(attributeName + ":  " + value);
                              }
                         }
                    }
                    System.err.println("------------------------------");
               }
               conLDAP.CerrarConLDAP(lc);
          } catch (LDAPException ex) {
               Logger.getLogger(Buscar.class.getName()).log(Level.SEVERE,null, ex);
          }
     }

     /**
     * Metodo Para Eliminar un usuario mandando como parametro el "uid"
     * @param strUser
     * @param strPass
     * @param strUIDEliminar
     */

     public void EliminarPorUID(String strUser, String strPass, String strUIDEliminar){
          String dn = "uid="+ strUIDEliminar + ",ou=People,o=utpl,c=ec";
          try {
               lc = conLDAP.ConexionManager(strUser, strPass);
               lc.delete(dn);
               System.out.println("\nEntry: " + dn + " Fue Eliminado Correctamente...");
               conLDAP.CerrarConLDAP(lc);
          } catch (LDAPException e) {
               if (e.getResultCode() == LDAPException.NO_SUCH_OBJECT) {
                    System.err.println("Error: NO existe ese usuario...");
               } else if (e.getResultCode() == LDAPException.INSUFFICIENT_ACCESS_RIGHTS) {
                    System.err.println("Error: NO tiene permisos suficientes para realizar esta transaccion...");
               } else {
                    System.err.println("Error: " + e.toString());
               }
          }
     }

     /**
     * Enviar Usuario a Modificar
     * @param strUser
     * @param strAtributo
     */

     public void Modificar(String strUser,String strAtributo) {
          try {
               LDAPAttribute atrubuto;
               lc = conLDAP.ConexionManager("Manager", "ibmlnx");
               atrubuto = new LDAPAttribute("mail", strAtributo);
               String dn = "uid="+strUser+",ou=People,o=utpl,c=ec";
               lc.modify(dn, new LDAPModification (LDAPModification.REPLACE, atrubuto));
               System.out.println("Atributo Modificado OK...");
          } catch (LDAPException ex) {
               if (ex.getResultCode() ==  LDAPException.INSUFFICIENT_ACCESS_RIGHTS) {
               System.err.println("Error: NO tiene permisos suficientes para realizar esta transaccion...");
               }
          }
     }

     public boolean ValidarPassWord(String strUser, String strPass) {
          boolean correct = false;
          String dnc = "uid=+" + strUser + ",ou=People,o=utpl,c=ec";
          try {
               lc.bind(LDAPConnection.LDAP_V3, dnc, strPass.getBytes("UTF8"));
               LDAPAttribute attr = new LDAPAttribute("userPassword", strPass);
               correct = lc.compare(dnc, attr);
               System.err.println(correct ? "El Password es correcto" : "El Password NO es correcto.\n");
          } catch (LDAPException ex) {
               Logger.getLogger(CRUD.class.getName()).log(Level.SEVERE,null, ex);
          } catch (UnsupportedEncodingException ex) {
               Logger.getLogger(CRUD.class.getName()).log(Level.SEVERE,null, ex);
          }
          return correct;
     }
}

Vea también:

Conexión al servidor LDAP desde JAVA

Busqueda de usuarios en el servidor LDAP

CRUD de usuarios en el servidor LDAP

Descargar Proyecto JAVA – Netbeans

Anuncios
Categorías:Java, ldap, Linux Etiquetas: , ,
  1. junio 11, 2009 en 11:34 am

    como se llama el jar que contines las clases y donde puedo descargarlo :
    import com.novell.ldap.LDAPAttribute;
    import com.novell.ldap.LDAPAttributeSet;
    import com.novell.ldap.LDAPConnection;
    import com.novell.ldap.LDAPEntry;
    import com.novell.ldap.LDAPException;
    import com.novell.ldap.LDAPModification;
    import com.novell.ldap.LDAPSearchResults;

    Gracoas

  2. juanlarg
    mayo 3, 2010 en 5:14 am

    Hola, estaba probando tu código y me suelta un error cuando intento añadir un usuarios desde el CRUD si pongo más de un ObjectClass, osea solo lo añade si tengo uno, si hay más de uno suelta este error:
    03-may-2010 12:11:54 conexionldap.CRUD Añadir
    GRAVE: null
    LDAPException: Violación De La Clase Del Objeto (65) Violación De La Clase Del Objeto
    LDAPException: Server Message: attribute ‘uid’ not allowed
    LDAPException: Matched DN:
    at com.novell.ldap.LDAPResponse.getResultException(Unknown Source)
    at com.novell.ldap.LDAPResponse.chkResultCode(Unknown Source)
    at com.novell.ldap.LDAPConnection.chkResultCode(Unknown Source)
    at com.novell.ldap.LDAPConnection.add(Unknown Source)
    at com.novell.ldap.LDAPConnection.add(Unknown Source)
    at conexionldap.CRUD.Añadir(CRUD.java:39)
    at conexionldap.Main.main(Main.java:29)
    BUILD SUCCESSFUL (total time: 0 seconds)

    La autenticación si la hace perfectamente, aver si sabes a que se debe 🙂

  3. mayo 3, 2010 en 11:34 am

    Hola @juanlarg

    Te comento que los ObjectClass tienen un orden de agregación si cambias el orden te dará errores la verdad no se a que se deba si lo descubres te ruego nos lo comentes, lo que te puedo sugerir es que lo intentes como lo he realizado aquí, quitando los atributos que no tenga tu servidor LDAP, a mi me a dado resultados bastante confiables, coméntame tus resultados…

    Saludos

    christmo

  4. juanlarg
    mayo 4, 2010 en 8:51 am

    Christ creo que es eso que comentas, ya que en mi servidor LDAP guardo información distinta a la que venía en el ejemplo y fue lo que modifiqué. Además consigo insertar ya bien, gracias por responder tan rápido, me vino muy bien tu post 🙂

  5. vascor
    agosto 13, 2010 en 12:16 pm

    Hola buenas tardes, oye tu aplicacion trae la librería novell ya inmersa?? sino es asi donde podria descargarla, gracias de antemano.

    • agosto 16, 2010 en 3:43 pm

      Hola la librería la puedes encontrar en el primer post, en el de conexión allí esta el enlace para poder descargar la librería de novell.

      Saludos

      christmo

  6. henry
    noviembre 14, 2010 en 10:47 am

    Hola, cuando intento agregar un usuario me sale el siguiente error:
    RR_277 Attribute uid not declared in objectClasses of entry uid=jsmith,cn=Administrators,ou=groups,ou=system
    LDAPException: Matched DN:
    at com.novell.ldap.LDAPResponse.getResultException(Unknown Source)
    at com.novell.ldap.LDAPResponse.chkResultCode(Unknown Source)
    at com.novell.ldap.LDAPConnection.chkResultCode(Unknown Source)
    at com.novell.ldap.LDAPConnection.add(Unknown Source)
    at com.novell.ldap.LDAPConnection.add(Unknown Source)

    • diciembre 6, 2010 en 10:29 pm

      @henry

      te recomiendo que revises el orden de los LDAPAttribute el orden influye en los resultados así como los puse en este ejemplo me funcionó si resuelves tu problema espero que nos lo cuentes saludos…

      christmo

  7. alfred
    febrero 28, 2011 en 5:54 pm

    Hola recien soy nuevo usando esa libreria podrian explicarme sobre los paramentros q manda. login = “cn=” + strManager + “,o=utpl,c=ec”;

    o=utpl,c=ec eso que indican?? gracias no eh podido conectarme x usuario
    me sale ese error…
    LDAPException: Credenciales Inv��lidas (49) Credenciales Inv��lidas

    gracias

    • febrero 28, 2011 en 6:04 pm

      Hola @alfred

      Veras dentro de los servidores LDAP, los usuarios se organizan como árbol, entonces dependiendo de la configuración de tu servidor LDAP vas a tener: Common Name CN, Organización O, Country C, a partir de estos parámetros se reconoce a los usuarios registrados dentro de nuestro dominio, lo que hago en esa parte que mencionas allí es armar una cadena de conexión para cada usuario dependiendo del nombre de usuario que ingresen strManager sería el nombre de usuario, y lo demás en mi caso iría igual ya que todos los usuarios están bajo la misma unidad organizativa o dominio que seria utpl y pais ecuador ec…

      Espero que te sirva te recomiendo chequear como es la estructura de un servidor LDAP para que no te complique este tipo de organización, la verdad no es muy complicado solo tienes que ponerle algo de atención en la estructura de los datos.

      saludor

      Christian Mora @christmo

      • alfred
        marzo 1, 2011 en 9:35 am

        gracias x la respuesta en mi caso mi dominio es hiper.com.pe
        y mi usuario por la que quiero conectarme es abarrios. mi conexion user ConexionUser
        como serian los parametros .
        login = “uid=” + abarrios+ “,ou=hiper,ou=com,ou=pe”; ?¡? aun no puedo conectarme

      • marzo 1, 2011 en 10:15 am

        yo creo que le podras probar as:

        login = “uid=” + abarrios+ “,ou=hiper,ou=com,c=pe”; login = “uid=” + abarrios+ “,ou=hiper,c=pe”; login = “uid=” + abarrios+ “,ou=hiper.com,c=pe”;

        Una de esas formas debera funcionar 😉

        Saludos

        Christian Mora @christmo

  8. alfred
    marzo 1, 2011 en 11:04 am

    gracias por la ayuda, pero probe de las 3 formas y sigo sin conectar , sale credenciales invalidas. q crees q estea pasandooo?¡?¡?, o estoy usando el jar incorrecto, el jar q me descargue es jldap-4.3.jar

    • marzo 1, 2011 en 11:09 am

      Te recomiendo usar Apache Directory Studio, es un entorno basado en eclipse para trabajar con LDAP, al configurar ese tendrs mas claro el panorama de como debes poner los parmetros en cdigo para que te funcione desde JAVA, bueno a mi me funcion espero que a ti tambin 😀

      Saludos

      Christian Mora blog: christmo99.wordpress.com twitter: @christmo

  9. Jnio Pedro
    marzo 1, 2011 en 11:59 am

    Hola soy nuevo con respecto a ldap,la consulta es la siguiente.En donde trabajo la maquinas se encuentran conectadas a un dominio y estamos desarrollando una aplicacion que autentifique ldap,e encontrado formas de autenticar mandando el usuario y password,pero quisiera saber si hay una forma donde no se ingrese el usuario o password,sino que tome la autenticacion ya hecha en la pc.De manera si un usario ingresa a una maquina,pueda acceder directamente a su configuracion respectiva sin necesidad de loguearse sino que sea de forma automatica.

    Gracias de antemano.

    • marzo 1, 2011 en 12:06 pm

      Yo lo hara enviando el nombre del usuario logueado en el sistema al programa para que a partir de eso se carguen las configuraciones para el, si es LDAP el nombre de usuario corresponder a un usuario y una clave del server LDAP, se puede obtener esto con esta linea:

      String usuario = System.getProperty(“user.name”);

      Espero que te sirva 😉 si lo haces de otra manera por favor hzmelo saber….

      Saludos

      Christian Mora blog: christmo99.wordpress.com twitter: @christmo

  10. Diduch
    junio 22, 2011 en 9:40 am

    una pregunta…Puedes modificar el uid de un usuario? o necesitarias borrarlo y crear otro?

  1. mayo 26, 2009 en 6:03 pm
  2. mayo 26, 2009 en 6:12 pm
  3. mayo 26, 2009 en 6:36 pm
  4. junio 2, 2009 en 1:33 pm
Los comentarios están cerrados.
A %d blogueros les gusta esto: