XLVIII. Funciones LDAP

Introducción a LDAP

LDAP es el protocolo de acceso a directorios ligero (Lightweight Directory Access Protocol), un protocolo usado para acceder a "Servidores de Directorio". El directorio es una clase especial de base de datos que contiene información estructurada en forma de árbol.

El concepto es similar a la estructura de directorios de los discos duros, pero en este caso, el directorio raiz es "El Mundo" y los subdirectorios de primer nivel son los "países". Niveles inferiores de la estructura de directorio contienen entradas para compañías, organizaciones o lugares, y en niveles aún inferiores se encuentran las entradas para la gente, y quizás de equipos informáticos y documentos.

Para referirse a un fichero en un subdirectorio del disco duro se usa algo como


    /usr/local/misapps/docs
    

Las barras marcan cada división en la referencia al fichero, y la secuencia es leida de izquierda a derecha.

El equivalente a la referencia a un fichero en LDAP es el "distinguished name" (nombre distinguible), abreviado como "db". Un ejemplo de dn podría ser.


    cn=Pedro Pérez,ou=Contabilidad,o=Mi Compañía,c=ES
    

Las comas marcan cada división en la referencia, y la secuencia se lee de derecha a izquierda. Este dn se leería como ..


    country = ES
    organization = Mi Compañía
    organizationalUnit = Contabilidad
    commonName = Pedro Pérez
    

De la misma manera que no hay reglas estrictas sobre como organizar la estructura de directorios de un disco duro, un administrador de un servidor de directorio puede establecer cualquier estructura que sea útil para sus propósitos. Sin embargo hay algunos acuerdos tácitos que siempre deben seguirse. El mensaje es que no se puede escribir código para acceder un directorio si no se conoce algo de su estructura, igual que no se puede usar una base de datos sin algún conocimiento sobre lo que está disponible en ella.

Ejemplo de código completo

Recuperar informacion para todas las entradas donde el apellido empiece por "P" de un servidor de directorio, mostrando un extracto con el nombre y dirección de correo electrónico.

Ejemplo 1. ejemplo de búsqueda LDAP

<?php
// La secuencia básica para trabajar con LDAP es conectar, autentificarse,
// buscar, interpretar el resultado de la búsqueda y cerrar la conexión.

echo "<h3>Prueba de consulta LDAP</h3>";
echo "Conectando ...";
$ds=ldap_connect("localhost");  // Debe ser un servidor LDAP válido!
echo "El resultado de la conexión es ".$ds."<p>";

if ($ds) { 
    echo "Autentificandose  ..."; 
    $r=ldap_bind($ds);     // Autentificación anónima, típicamente con
                           // acceso de lectura
    echo "El resultado de la autentificación es ".$r."<p>";

    echo "Buscando (sn=P*) ...";
    // Busqueda de entradas por apellidos
    $sr=ldap_search($ds,"o=Mi Compañia, c=ES", "sn=P*");  
    echo "El resultado de la búsqueda es ".$sr."<p>";

    echo "El número de entradas devueltas es ".ldap_count_entries($ds,$sr)."<p>";

    echo "Recuperando entradas ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Devueltos datos de ".$info["count"]." entradas:<p>";

    for ($i=0; $i<$info["count"]; $i++) {
        echo "dn es: ". $info[$i]["dn"] ."<br>";
        echo "La primera entrada cn es: ". $info[$i]["cn"][0] ."<br>";
        echo "La primera entrada email es: ". $info[$i]["mail"][0] ."<p>";
    }

    echo "Cerrando conexión";
    ldap_close($ds);

} else {
    echo "<h4>Ha sido imposible conectar al servidor LDAP</h4>";
}
?>

Usando las llamadas LDAP de PHP

Es necesario conseguir y compilar la librerías cliente de LDAP ya sea del paquete ldap-3.3 de la Universidad de Michigan o del Netscape Directory SDK. También es necesario recompilar PHP con soporte LDAP activado para que la funciones LDAP de PHP funcionen.

Antes de usarse las llamadas LDAP se debe saber ..

  • El nombre o dirección del servidor de directorio que se va a usar

  • El "dn base" del servidor (la parte del directorio global contenida en ese servidor, que puede ser por ejemplo "o=Mi Compañia,c=ES")

  • Si es necesaria contraseña para acceder al servidor (muchos servidores ofrecen acceso de lectura para usuarios anónimos pero requieren un password para cualquier otro acceso)

La secuencia típica de llamadas LDAP suele implementarse en aplicaciones que siguen el siguiente patrón:


  ldap_connect()    // establecer la conexión con el servidor
     |
  ldap_bind()       // login anónimo o autentificado
     |
  Hacer búsquedas o actualizaciones en el directorio
  y mostrar los resultados
     |
  ldap_close()      // Cerrar la conexión

Más información

Mucha información acerca de LDAP puede ser consultada en

El SDK de Netscape contiene una Guía de Programación muy útil en formato html.

Tabla de contenidos
ldap_8859_to_t61 --  Translate 8859 characters to t61 characters
ldap_add -- Añade entradas a un directorio LDAP
ldap_bind -- Autentifica en un directorio LDAP
ldap_close -- Cierra una conexión a un servidor LDAP
ldap_compare -- Compare value of attribute found in entry specified with DN
ldap_connect -- Conecta con un servidor LDAP
ldap_count_entries -- Cuenta el número de entradas de una búsqueda
ldap_delete -- Borra una entrada de un directorio
ldap_dn2ufn -- Convierte un dn al formato User Friendly Naming
ldap_err2str --  Convierte un código numérico de error LDAP en un mensaje.
ldap_errno --  Devuelve el código numérico de error para el último comando LDAP.
ldap_error --  Devuelte el mensaje de error del último comando LDAP
ldap_explode_dn -- Divide un DN en las partes que le componen
ldap_first_attribute -- Devuelte el primer atributo
ldap_first_entry -- Devuelve el identificador del primer resultado
ldap_first_reference --  Return first reference
ldap_free_result -- Libera la memoria que almacena los resultados
ldap_get_attributes -- Obtiene los atributos de una entrada de un resultado de búsqueda
ldap_get_dn -- Obtiene el DN de una entrada de un resultado
ldap_get_entries -- Obtiene todas las entradas de un resultado
ldap_get_option -- Get the current value for given option
ldap_get_values_len -- Obtiene todos los valores binarios de un atributo de una entrada
ldap_get_values -- Obtiene todos los valores de un atributo de una entrada
ldap_list -- Búsqueda Single-level (Nivel Único)
ldap_mod_add -- Añade valores de atributos
ldap_mod_del -- Borra valores de atributos
ldap_mod_replace -- Reemplaza valores de atributos
ldap_modify -- Modifica una entrada LDAP
ldap_next_attribute -- Obtiene el siguiente atributo de una entrada
ldap_next_entry -- Obtiene la siguiente entrada de un resultado
ldap_next_reference --  Get next reference
ldap_parse_reference --  Extract information from reference entry
ldap_parse_result --  Extract information from result
ldap_read -- Lee una entrada
ldap_rename -- Modify the name of an entry
ldap_search -- Busca en un arbol LDAP
ldap_set_option -- Set the value of the given option
ldap_set_rebind_proc --  Set a callback function to do re-binds on referral chasing.
ldap_sort --  Sort LDAP result entries
ldap_start_tls --  Start TLS
ldap_t61_to_8859 --  Translate t61 characters to 8859 characters
ldap_unbind -- Hace logout de un directorio LDAP