Autenticar usuarios usando Active Directory(LDAP) en SugarCRM

Hoy me tocó instalar la actualización 5.5 de Sugar, la última versión que estabamos utilizando era la versión 5.2 y pues habíamos identificado algunos problemas en esa versión.

Bueno, así que instalé Sugar 5.5 y cuando estaba a punto de importar los usuarios de la instalación pasada noté que se podían logear los usuarios usando LDAP o Active Directory de Microsoft.

Aprovechándo que aquí en la empresa cuentan con un servidor con Active Directory me aventuré a probar, y recurriendo a estos vínculos:

http://www.sugarcrm.com/forums/showthread.php?t=31950&highlight=ldap

http://www.sugarcrm.com/wiki/index.php?title=Integrating_SugarCRM_with_Windows_Active_Directory

http://zhalbrecht.webfactional.com/blog/2008/03/05/configuring-ldap-authentication-using-sugarcrm-and-active-directory/

http://www.sugarcrm.com/wiki/index.php?title=Authenticate_with_LDAP_through_SOAP

Pues acabé con una configuración como ésta:

Server: xxx.xxx.xxx.xxx (la ip del servidor pues éste se encuentra en la intranet)

User DN: CN=Users, DC=example, DC=com (el Active Directory (?) donde se encuentran los usuarios lo podemos identificar usando http://www.ldapbrowser.com/, solo tenemos que identificar el directorio que alberga a los usuarios).

Port: 389 El puerto en el que normalmente escucha LDAP

Bind Attribute: cn <– algunos también consiguieron que funcionara con userPrincipalName, yo recomendaría probar con los dos dígitos que preceden al directorio de los usuarios en User DN, en este caso cn.

Login Attribute: samaccountname <– Podría ser userPrincipalName también ó  sAMAccountName, prueben con todos.

Authentication (marcado).

User Name: user@example.com Este debe ser un usuario con acceso a explorar todos los usuarios, he encontrado referencias a que éste usuario debe ser un usuario administrador del dominio pero en mi caso funcionó con un usuario común, nótese que al final del nombre de usuario agrego el dominio, si en login attribute han escrito samaccountname no debería ser necesario añadir el dominio al logearse en SugarCRM, y esto lo pueden comprobar también usando LDAP Browser, miren los atributos de cada usuario.

Password: **********

Y pues esto es todo, los comentarios son bienvenidos 🙂

3 thoughts on “Autenticar usuarios usando Active Directory(LDAP) en SugarCRM”

  1. Hola tengo una consulta.
    Tengo una intranet instalada PHP. En la empresa utilizan active directory para que los empleados accedan a sus escritorios de windows y necesito poder detectar el usuario para que acceda la intranet y no deba volver a ingresar los datos de acceso.

    Segun la persona que me esta desarrollando la aplicacion dice que no se puede pero segun lo que creo entender en tu pos esto si es posible.

    Me podrias confirmar si esto que solicito se puede hacer.

    Muchas Gracias

    1. Si es posible, Active Directory es una implementacion de Microsoft para el servicio de directorio LDAP, de manera semejante existen otras implementaciones como OpenLDAP y el protocolo de comunicacion para directorios LDAP es conocido, existiendo implementaciones para varios lenguajes de programacion de los cuales he probado Java y PHP, te recomendaria que revises estos articulos:

      http://www.javaworld.com/javaworld/jw-03-2000/jw-0324-ldap.html
      http://www.developer.com/net/article.php/3100951/Integrating-Active-Directory-with-PHP

  2. /**
    *
    */
    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;
    }

    }

    i cant to conect

Leave a Reply to elespaciodejaime Cancel reply

Your email address will not be published. Required fields are marked *