CRUD de usuarios en el servidor LDAP + JAVA
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








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
Hola veras el jar lo puedes descargar en el link que se encuentra en el primer parrafo de este post… http://christmo99.wordpress.com/2009/05/26/conexion-a-servidor-ldap-desde-java/ o directamente desde http://developer.novell.com/wiki/index.php/LDAP_Classes_for_Java
saludos
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
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
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
Hola buenas tardes, oye tu aplicacion trae la librería novell ya inmersa?? sino es asi donde podria descargarla, gracias de antemano.
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
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)
@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
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
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
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
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
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
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
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.
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
una pregunta…Puedes modificar el uid de un usuario? o necesitarias borrarlo y crear otro?