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
Gracias, yo tengo un login en windows con xampp , pero al pasar la palicacion a centos 7, no me funciona, ya instale ldap php y habilite los so, pero no conecta, alguien sabe algo mas que pueda rebizar,Muchas gracias. al probar con estos archivos cambiando los parametros me genera el siguiente error. Error trying to bind: Can’t contact LDAP server
el servidor si se conecta con el servidor ldap, por que el login de la maquina lo hacemos contra ldap, el problema es solo con la palicacon que tengo mondata con php.
Parece que no esta alcanzando el servidor LDAP -> Can’t contact LDAP server, revise que esta todo correcto