Inicio > Java, ldap, Linux, NetBeans > Conexión a Servidor LDAP desde JAVA

Conexión a Servidor LDAP desde JAVA

mayo 26, 2009

Hola en en trabajo me pidieron realizar una conexión a un servidor LDAP desde una aplicación java, esto me pareció algo difícil en un principio ya que no tenía idea de como realizar algo parecido, con algunas sugerencias de parte de mi jefe decidimos usar la librería de novell para java jLDAP, esta librería es muy completa y permite realizar todas las posibles transacciones dentro de un servidor LDAP, novell también tiene bien documentado esto hasta con ejemplos todo el API esta aquí, una ves que te familiarizas con el código vas a ver que todo es muy fácil, pero es esta serie de posts vamos a ejemplificar como se podría hacer un CRUD dentro de nuestro servidor.

Para realizar la conexión aremos lo siguiente:


package conexionldap;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author christian
* Clase de Conexion Servidor LDAP
*/

public class Conexion {

     private int ldapPort;
     private int ldapVersion;
     private LDAPConnection lc;
     private String login;
     private String ldapHost = "172.16.30.162";

     public Conexion() {
     }

     /**
     * Este método permite realizar la conexión al servidor de LDAP
     * Para el usuario manager
     * @param strManager
     * @param strPassword
     */

     public LDAPConnection ConexionManager(String strManager, String strPassword) {
          login = "cn=" + strManager + ",o=utpl,c=ec";
          System.out.println("" + login);
          ldapPort = LDAPConnection.DEFAULT_PORT;
          System.out.println("puerto: " + ldapPort);
          ldapVersion = LDAPConnection.LDAP_V3;
          System.out.println("Vesion: " + ldapVersion);
          System.out.println("HOST: " + ldapHost);
          try {
               lc = new LDAPConnection();
               lc.connect(ldapHost, ldapPort);
               System.out.println("====Conectado al Servidor LDAP====");
               lc.bind(ldapVersion, login, strPassword.getBytes("UTF8"));
               System.out.println("Autenticado en el servidor....");
          } catch (UnsupportedEncodingException ex) {
               Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
          } catch (LDAPException ex) {
               Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
          }
          return lc;
     }

     /**
     * Este metodo permite realizar la conexion al servidor de LDAP
     * Para el usuario manager
     * @param strUser
     * @param strPassword
     */

     public LDAPConnection ConexionUser(String strUser, String strPassword) {
          login = "uid=" + strUser + ",ou=People,o=utpl,c=ec";
          System.out.println("" + login);
          ldapPort = LDAPConnection.DEFAULT_PORT;
          System.out.println("puerto: " + ldapPort);
          ldapVersion = LDAPConnection.LDAP_V3;
          System.out.println("Vesion: " + ldapVersion);
          System.out.println("HOST: " + ldapHost);
          try {
               lc = new LDAPConnection();
               lc.connect(ldapHost, ldapPort);
               System.out.println("====Conectado al Servidor LDAP====");
               lc.bind(ldapVersion, login, strPassword.getBytes("UTF8"));
          } catch (UnsupportedEncodingException ex) {
               Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
          } catch (LDAPException ex) {
               Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
          }
          return lc;
     }

     public void CerrarConLDAP(LDAPConnection lc) {
          try {
               lc.disconnect();
               System.out.println("Conexion Cerrada Correctamente...");
          } catch (LDAPException ex) {
               Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE,null, ex);
          }

     }

}

Continuar:

Busqueda de usuarios en el servidor LDAP

CRUD de usuarios en el servidor LDAP

Descargar Proyecto JAVA – Netbeans

Anuncios
Categorías:Java, ldap, Linux, NetBeans Etiquetas: , ,
  1. Laura
    octubre 13, 2009 en 5:19 am

    Hola,

    estoy mirando tu código para insertar un usuario en el ldap, el usuario se inserta en el ldap pero tengo un problema. En el código de insertar los datos del

    usuario, este código:

    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(“top”)));

    Solo inserta el primer objectClass, es decir, person, los demás no los inserta. Tienes idea cual puede ser el problema?.

    Muchas gracias.

    Un saludo.

    Laura.

  2. juanlarg
    mayo 25, 2010 en 5:42 am

    Hola chris 🙂 Te quería preguntar una duda, ya que no se mucho de java y quizás tu sepas contestarla porque trata este tema.. He construido este código, autentica a un usuario normal contra el directorio LDAP. Lo hace bien devuelve la string si se conecta o no la devuelve si no lo hace, eso me sirve, pero mi duda es saber si podría hacerse lo mismo SIN definir el ou (la unidad organizativa) del usuario, ya que quiero que autentique en general. Además que los mismos usuarios no sabrían cual es su OU para poder definirla mientras se autentican, pero no se si se puede hacer como yo quiero.

    //Método que autentica al usuario en nuestra conexion.
        private static String Aut1(LDAPConnection conn, String host, int port, String dn, String passwd )  {
            try {
                        conn.connect( host, port );
                        conn.bind( LDAPConnection.LDAP_V3, dn, passwd.getBytes("UTF8") );
    
                        if(conn.isBound()){
                            return "Conectado";
                        }else{
                            return "No conectado";
                        }    
                    
            }
            catch (UnsupportedEncodingException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                 return "No conectado";
            }        catch (LDAPException ex) {
                //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                return "No conectado";
            }        finally{
                //conn.disconnect();
            }
       }
    

    Gracias por adelantado, haber si podemos solucionarlo 😀

    • mayo 25, 2010 en 1:45 pm

      Hola @juanlarg

      Te comento que no podrías dejar de la la Unidad Organizativa, ya que el servidor LDAP trabaja con ello para hacer la localización de los datos y establecer la cadena de conexión, te recomiendo que si lo quieres dejar libre, te hagas una clase para manejar roles de los usuarios que vas a permitir que se logueen con ello podrás dejar estática la OU, o lo podrías configurar en el servidor LDAP con una unidad organizativa General como en este caso People…

      Espero que te sirva, y que nos lo comentes si encuentras una mejor solución para así aprender todos… 😉

      Saludo

      christmo

  3. AIN
    junio 3, 2010 en 6:56 am

    Muy bueno. Gracias por compartir tu esfuerzo

  4. JRueda
    diciembre 3, 2010 en 5:23 am

    Muchisimas gracias por tu ayuda christmo.
    Todo ha sido mas facil gracias a tu increible esfuerzo….

    • diciembre 6, 2010 en 10:25 pm

      Gracias 😉

  5. $Ansx
    enero 17, 2011 en 3:43 pm

    /**
    *
    */
    package com.hsbc.group.redencion.service.impl;

    import java.util.ArrayList;
    import java.util.Hashtable;
    import java.util.StringTokenizer;

    import javax.naming.Context;
    import javax.naming.NamingEnumeration;
    import javax.naming.NamingException;
    import javax.naming.directory.SearchControls;
    import javax.naming.directory.SearchResult;
    import javax.naming.ldap.InitialLdapContext;
    import javax.naming.ldap.LdapContext;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import com.hsbc.group.redencion.exception.AuthenticationException;
    import com.hsbc.group.redencion.service.LdapService;
    import com.hsbc.group.redencion.viewbean.Usuario;

    /**
    * @author PA591562
    *
    */
    public class LdapServiceImpl implements LdapService {

    Log log = LogFactory.getLog(this.getClass().getName());

    private String dominio;
    private String ldapHost;
    private String searchBase;

    /**
    * @return the ldapHost
    */
    public String getLdapHost() {
    return ldapHost;
    }

    /**
    * @param ldapHost
    * the ldapHost to set
    */
    public void setLdapHost(String ldapHost) {
    this.ldapHost = ldapHost;
    }

    /**
    * @return the searchBase
    */
    public String getSearchBase() {
    return searchBase;
    }

    /**
    * @param searchBase
    * the searchBase to set
    */
    public void setSearchBase(String searchBase) {
    this.searchBase = searchBase;
    }

    /**
    * @param dominio
    * the dominio to set
    */
    public void setDominio(String dominio) {
    this.dominio = dominio;
    }

    /**
    * @return the dominio
    */
    public String getDominio() {
    return dominio;
    }

    // Constructor.
    public LdapServiceImpl() {
    dominio = “panama”;
    this.ldapHost = “ldap://panama.corp.local:389”;
    searchBase = “dc=panama, dc=corp, dc=local”;

    }

    public Usuario autenticacion(Usuario usuario)
    throws AuthenticationException {
    String returnedAtts[] = { “sn”, “givenName”, “userPrincipalName” };
    String searchFilter = “(&(objectClass=user)(sAMAccountName=”
    + usuario.getUsuario() + “))”;
    Usuario u = null;

    try {
    NamingEnumeration answer = search(usuario.getUsuario(), usuario
    .getContrasena(), searchFilter, returnedAtts);

    while (answer.hasMoreElements()) {
    SearchResult sr = (SearchResult) answer.next();
    Hashtable data = getFields(sr.toString());
    if (data != null) {
    u = new Usuario();
    u.setNombreCompleto((String) data.get(“givenName”));
    u.setUsuario((String) data.get(“userPrincipalName”));
    }
    }
    } catch (NamingException ex) {

    // ex.printStackTrace();
    throw new AuthenticationException(ex.getMessage());
    }

    return u;
    }

    public ArrayList buscarUsuario(String nombre, String usuario)
    throws AuthenticationException {
    ArrayList users = new ArrayList();
    String userAdmin = “pa591562”;
    String pass = “isthmian”;
    String returnedAtts[] = { “displayName”, “userPrincipalName”,
    “samaccounttype”, “useraccountcontrol” };
    String searchFilter = “(&(objectclass=user))”;

    try {

    NamingEnumeration answer = search(userAdmin, pass, searchFilter,
    returnedAtts);
    StringTokenizer token = null;
    Usuario user = null;
    while (answer.hasMoreElements()) {
    SearchResult sr = (SearchResult) answer.next();
    if (sr.toString().indexOf(“sAMAccountType: 805306368”) > 0
    && (sr.toString().indexOf(“userAccountControl: 66048”) > 0 || sr
    .toString().indexOf(“userAccountControl: 512”) > 0)) {
    Hashtable data = getFields(sr.toString());
    if (data != null) {
    // System.out.println(sr);
    user = new Usuario();
    user
    .setNombreCompleto((String) data
    .get(“displayName”));
    user.setUsuario((String) data.get(“userPrincipalName”));
    users.add(user);
    }
    // users.add(token.nextToken().substring(3));
    }
    }
    } catch (NamingException ex) {
    ex.printStackTrace();
    }

    return users;
    }

    public ArrayList getListaUsuario() throws AuthenticationException {

    ArrayList users = new ArrayList();
    String username = “administrador”;
    String pass = “isthmian”;
    String returnedAtts[] = { “displayName”, “samaccounttype”,
    “useraccountcontrol” };
    String searchFilter = “(&(objectclass=user))”;

    try {

    NamingEnumeration answer = search(username, pass, searchFilter,
    returnedAtts);
    StringTokenizer token = null;
    Usuario user = null;
    while (answer.hasMoreElements()) {
    SearchResult sr = (SearchResult) answer.next();
    if (sr.toString().indexOf(“sAMAccountType: 805306368”) > 0
    && (sr.toString().indexOf(“userAccountControl: 66048”) > 0 || sr
    .toString().indexOf(“userAccountControl: 512”) > 0)) {
    Hashtable data = getFields(sr.toString());
    if (data != null) {
    user = new Usuario();
    user
    .setNombreCompleto((String) data
    .get(“displayName”));
    user.setUsuario((String) data.get(“userPrincipalName”));
    users.add(user);
    }
    // users.add(token.nextToken().substring(3));
    }
    }
    } catch (NamingException ex) {
    ex.printStackTrace();
    }

    return users;
    }

    private NamingEnumeration search(String adminUser, String adminCredential,
    String searchFilter, String[] returnedAtts)
    throws javax.naming.AuthenticationException, NamingException {
    // Create the search controls
    SearchControls searchCtls = new SearchControls();
    searchCtls.setReturningAttributes(returnedAtts);
    // Specify the search scope
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
    “com.sun.jndi.ldap.LdapCtxFactory”);
    env.put(Context.PROVIDER_URL, ldapHost);
    env.put(Context.SECURITY_AUTHENTICATION, “simple”);
    env.put(Context.SECURITY_PRINCIPAL, adminUser + “@” + dominio);
    env.put(Context.SECURITY_CREDENTIALS, adminCredential);

    LdapContext ctxGC = null;
    ctxGC = new InitialLdapContext(env, null);
    // Search objects in GC using filters
    NamingEnumeration answer = ctxGC.search(searchBase, searchFilter,
    searchCtls);
    return answer;
    }

    private Hashtable getFields(String value) {
    Hashtable data = new Hashtable();
    if (value != null) {
    int index = value.indexOf(“{“);

    if (index > 0) {
    value = value.substring(index + 1, value.length() – 1);
    // System.out.println(value);
    StringTokenizer token = new StringTokenizer(value, “,”);
    String key = null;
    while (token.hasMoreElements()) {
    key = token.nextToken();
    index = key.indexOf(“=”);
    value = key.substring(index + 1);
    index = value.indexOf(“:”);
    key = value.substring(0, index);
    value = value.substring(index + 1);
    data.put(key, value);
    }
    }
    }
    return data;
    }

    }

    CREES QUE SI ESTE USER EXISTE MI CODIGO FUNCIONARIA???

    REVISA ESTE CODE Y ME DICES: ES QUE NUNCA LO ENCUETRA.

  6. junio 27, 2012 en 8:12 pm

    The very next time I read a blog, Hopefully it does not fail
    me just as much as this particular one. After all,
    Yes, it was my choice to read, but I genuinely thought you would have
    something useful to say. All I hear is a bunch of whining about something you could possibly
    fix if you were not too busy looking for attention.

  7. agosto 20, 2012 en 4:28 am

    Every weekend i used to visit this web page, as i want enjoyment, since this this website conations
    in fact fastidious funny information too.

  8. diciembre 15, 2012 en 7:12 am

    Or so angry you could spit. Put in a $15 Blockbuster card,
    movie sized candy and a bag or two of unpopped microwave popcorn.

    Instead of hiring a DJ or catering your holiday event, make sure that your holiday party invitations encourage your talented friends to perform, bring dishes for a potluck or provide entertainment in the form of a white elephant
    gift exchange or ornament exchange.

  9. enero 24, 2013 en 9:41 am

    I am regular visitor, how are you everybody? This piece of writing posted at
    this web site is actually pleasant.

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