Consultar LDAP desde PHP

Un elemento en común entra las empresas, organizaciones, universidades, etc, es el uso de LDAP como directorio activo para los usuarios.

Pues con la entrada de hoy voy a explicar como se realiza una consulta ldap en php.

Lo primero que haremos es habilitar la extensión phpLDAP para poder consultar el LDAP, dependiendo del sistema operativo utilizado.

//windows habilitar extension=php_ldap.dll
//centos 7: yum install php-ldap
//debian apt-get install php7.0-ldap

Y lo siguiente es utilizar un servidor ldap para realizar las pruebas, para el ejemplo he utilizado zflexsoftware que es libre, para realizar pruebas. https://www.zflexsoftware.com/index.php/pages/free-online-ldap

Para realizar la aplicación separaremos las variables de configuración en un fichero config.php, con la url del servidor ldap, usuario y contraseña para autenticar, la base del ldap, la base de la búsqueda y la columna que queremos buscar.

$config['version'] = '1.0';
$config['urlLdap'] = 'ldap://www.zflexldap.com:389';
$config['baseLdap'] = 'dc=zflexsoftware,dc=com';
$config['usernameConsultaLdap'] = 'cn=ro_admin,ou=sysadmins,dc=zflexsoftware,dc=com';
$config['passwordConsultaLdap'] = 'zflexpass';
$config['baseSearch'] = 'ou=users,ou=guests,dc=zflexsoftware,dc=com';
$config['columnaLdap'] = 'mail';

Y en la aplicación index.php, utilizaremos las siguientes funciones:

//Conexión al servidor LDAP: 
$ldapbind =  ldap_connect($config['urlLdap'])
//Autenticación  LDAP: 
$ldapbind =  ldap_bind($ldapconn, $config['usernameConsultaLdap'], $config['passwordConsultaLdap'])
//Búsqueda LDAP: 
$serch = ldap_search($ldapconn, $config['baseSearch'], "uid=*")

En el ejemplo queremos tener todos los mails del dominio con lo que usaremos el comodín * para cada uid y solicitamos la columna mail.

El resultado devuelto es un array multidimensional que recorremos con un bucle for.

            for ($i = 0; $i < count($data); $i++) {             
                    echo $data[$i][$config['columnaLdap']][0];
            }

El resultado seria el siguiente:

El código utilizado es el siguiente:

<?php
//config.php
$config['version'] = '1.0';
$config['urlLdap'] = 'ldap://www.zflexldap.com:389';
$config['baseLdap'] = 'dc=zflexsoftware,dc=com';
$config['usernameConsultaLdap'] = 'cn=ro_admin,ou=sysadmins,dc=zflexsoftware,dc=com';
$config['passwordConsultaLdap'] = 'zflexpass';
$config['baseSearch'] = 'ou=users,ou=guests,dc=zflexsoftware,dc=com';
$config['columnaLdap'] = 'mail';
?>
<?php
//index.php

require './config.php';

//windows extension=php_ldap.dll
//centos 7: yum install php-ldap
//debian apt-get install php7.0-ldap
//https://www.zflexsoftware.com/index.php/pages/free-online-ldap

// conexión al servidor LDAP
$ldapconn = ldap_connect($config['urlLdap']) or die("Could not connect to LDAP server.");

if ($ldapconn) {
    // realizando la autenticación
    $ldapbind = ldap_bind($ldapconn, $config['usernameConsultaLdap'], $config['passwordConsultaLdap']) or die("Error trying to bind: " . ldap_error($ldapconn));
    
    // verificación del enlace
    if ($ldapbind) {
        $search = ldap_search($ldapconn, $config['baseSearch'], "uid=*") or die("Error in search query: " . ldap_error($ldapconn));
        
        //validamos busqueda
        if ($search) {
            $data = ldap_get_entries($ldapconn, $search);
            
            echo '<h1>Listado de emails</h1>';
            echo '<br>';
            
            //recorremos busqueda
            for ($i = 0; $i < count($data); $i++) {             
                if (isset($data[$i][$config['columnaLdap']][0])) {
                    echo $data[$i][$config['columnaLdap']][0];
                    echo '<br>';
                }
            }
            
        }
    }   
    ldap_close($ldapconn);   
}
?> 

Y lo podéis descargar desde aquí: https://github.com/victorgarciasisi/testLDAP

2 comentarios en “Consultar LDAP desde PHP”

  1. Hola, gracias por compartir. Solo un tema, creo que el servidor publico de ejemplo no esta activo mas, pero lo probe con el mio y funcionó. Claro que antes tuve que cambiar el uid por el sAMAccountName, ya que yo lo utilizo asi en mi servidor. Espero que a alguien mas le ayude.
    Gracias nuevamente

    Responder

Deja un comentario