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
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
Muchas gracias Mario por colaborar.
Actualizare el servidor publico, poruqe cuando cree la entrada si que era funcional.
Un saludo.
Y cómo comprobar si mi sitio web php está en un dominio AD (LDAP) o no, para en este caso hacer una validación LDAP, y en otro caso, otra validación (por ejemplo, contra BD MySQL), facilitando de esta forma la portabilidad de mi desarrollo???
Me se entiende?? 😀
Gracias!!
Correcto