Funciones LDAP

LXVI. Funciones LDAP

Introducci贸n

LDAP es el protocolo simple de acceso a directorios (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 m谩s inferiores se encuentran las entradas para la gente, y en algunos casos equipos inform谩ticos y documentos.

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


    /usr/local/misapps/docs
   

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

El equivalente a la referencia a un archivo en LDAP es el "distinguished name" (nombre distinguible), abreviado como "dn". 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. La conclusi贸n es que no se pueden escribir programas para acceder a 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.

Informaci贸n sobre LDAP se puede encontrar en:

Netscape SDK tiene una Guia de programaci贸n muy buena en HTML.

Requisitos

Se necesita obtener y compilar las bibliotecas LDAP cliente de la direcci贸n de OpenLDAP o de Bind9.net para poder compilar PHP con soporte LDAP.

Instalaci贸n

Para incluir el soporte de LDAP en PHP, es necesario a帽adir el par谩metro --with-ldap[=DIR] a las opciones de configuraci贸n de la compilaci贸n de PHP, donde DIR apunta al directorio base de instalaci贸n de LDAP. Para incluir soporte de SASL, tambi茅n se debe a帽adir la siguiente opci贸n de compilaci贸n --with-ldap-sasl[=DIR], y adem谩s el archivo sasl.h debe existir en el sistema.

Nota para los usuarios de Windows: Para habilitar este m贸dulo en entornos Windows, se deben copiar varios archivos de la carpeta DLL del directorio PHP/Win32 a la carpeta SYSTEM del sistema (que normalmente se encuentra en C:\WINNT\SYSTEM32 o C:\WINDOWS\SYSTEM). Para las versiones de PHP <= 4.2.0 se tiene que copiar el archivo libsasl.dll, para las versiones de PHP >= 4.3.0 se deben copiar los archivos libeay32.dll y ssleay32.dll.

Configuraci贸n en tiempo de ejecuci贸n

El comportamiento de estas funciones est谩 afectado por los valores definidos en php.ini.

Tabla 1. Opciones de configuraci贸n de LDAP

NombreValor por defectoDonde se cambiaRegistro de cambios
ldap.max_links"-1"PHP_INI_SYSTEM 
For further details and definitions of the PHP_INI_* constants, see the Ap茅ndice G.

Tipos de recursos

Esta extensi贸n no tiene ning煤n tipo de recurso definido.

Constantes predefinidas

Estas constantes est谩n definidas por esta extensi贸n y estar谩n disponibles solamente cuando la extensi贸n ha sido o bien compilada dentro de PHP o grabada din谩micamente en tiempo de ejecuci贸n.

LDAP_DEREF_NEVER (integer)

LDAP_DEREF_SEARCHING (integer)

LDAP_DEREF_FINDING (integer)

LDAP_DEREF_ALWAYS (integer)

LDAP_OPT_DEREF (integer)

LDAP_OPT_SIZELIMIT (integer)

LDAP_OPT_TIMELIMIT (integer)

LDAP_OPT_PROTOCOL_VERSION (integer)

LDAP_OPT_ERROR_NUMBER (integer)

LDAP_OPT_REFERRALS (integer)

LDAP_OPT_RESTART (integer)

LDAP_OPT_HOST_NAME (integer)

LDAP_OPT_ERROR_STRING (integer)

LDAP_OPT_MATCHED_DN (integer)

LDAP_OPT_SERVER_CONTROLS (integer)

LDAP_OPT_CLIENT_CONTROLS (integer)

LDAP_OPT_DEBUG_LEVEL (integer)

GSLC_SSL_NO_AUTH (integer)

GSLC_SSL_ONEWAY_AUTH (integer)

GSLC_SSL_TWOWAY_AUTH (integer)

Ejemplos

Recuperar informacion para todas las entradas donde el apellido empiece por "P" de un servidor de directorio, mostrando un listado 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 valido!
echo "El resultado de la conexion es ".$ds."<br />";

if (
$ds) {
    echo
"Autentificandose  ...";
    
$r=ldap_bind($ds);     // Autentificacion anonima, habitual de los
                           // accesos de solo lectura
    
echo "El resultado de la autentificacion es ".$r."<br />";

    echo
"Buscando (sn=P*) ...";
    
// Busqueda de entradas por apellidos
    
$sr=ldap_search($ds,"o=Mi Compania, c=ES", "sn=P*");  
    echo
"El resultado de la busqueda es ".$sr."<br />";

    echo
"El numero de entradas devueltas es ".ldap_count_entries($ds,$sr)."<br />";

    echo
"Recuperando entradas ...<p>";
    
$info = ldap_get_entries($ds, $sr);
    echo
"Se han encontrado ".$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] ."<br /><hr />";
    }

    echo
"Cerrando conexion";
    
ldap_close($ds);

} else {
    echo
"<h4>No ha sido posible conectarse al servidor LDAP</h4>";
}
?>

Usando las funciones LDAP de PHP

Antes de usar las funciones LDAP deben conocerse los siguientes datos...

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

  • El "dn base" del servidor (la parte del directorio global que maneja ese servidor, que puede ser por ejemplo "o=Mi Compa帽铆a,c=ES")

  • Si es necesaria contrase帽a para acceder al servidor (muchos servidores ofrecen acceso de lectura para usuarios an贸nimos pero requieren una contrase帽a para cualquier otro acceso)

La secuencia t铆pica de llamadas a funciones LDAP que realizan las aplicaciones suele seguir el siguiente patr贸n:


  ldap_connect()    // establecer la conexi贸n con el servidor
     |
  ldap_bind()       // acceso an贸nimo o autentificado
     |
  Hacer b煤squedas o actualizaciones en el directorio
  y mostrar los resultados
     |
  ldap_close()      // cerrar la conexi贸n
    

Tabla de contenidos
ldap_8859_to_t61 --  Transforma caracteres en formato 8859 a caracteres en formato t61
ldap_add -- A帽ade entradas a un directorio LDAP
ldap_bind -- Autenticaci贸n en un directorio LDAP
ldap_close -- Alias of ldap_unbind()
ldap_compare -- Compara un valor indicado con el valor de un atributo especificado mediante su 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 a un formato m谩s legible
ldap_err2str --  Convertir el n煤mero de error LDAP a un mensaje de error tipo cadena
ldap_errno --  Devuelve el n煤mero de error LDAP del 煤ltimo comando LDAP
ldap_error --  Devuelve el mensaje de error LDAP del 煤ltimo comando LDAP
ldap_explode_dn -- Divide un DN en las partes que lo componen
ldap_first_attribute -- Devuelte el primer atributo
ldap_first_entry -- Devuelve el identificador del primer resultado
ldap_first_reference --  Devuelve la primera referencia
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 -- Obtiene el valor de la opci贸n indicada
ldap_get_values_len -- Obtiene todos los valores binarios de un atributo de una entrada de un resultado
ldap_get_values -- Obtiene todos los valores de una entrada de un resultado
ldap_list -- B煤squeda de nivel 煤nico
ldap_mod_add -- A帽ade valores a los 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 de un resultado
ldap_next_entry -- Obtiene la siguiente entrada de un resultado
ldap_next_reference --  Obtiene la siguiente referencia
ldap_parse_reference --  Obtiene informaci贸n de la entrada de referencia
ldap_parse_result --  Obtiene informaci贸n de un resultado
ldap_read -- Lee una entrada
ldap_rename -- Modifica el nombre de una entrada
ldap_sasl_bind --  Autenticarse en un directorio LDAP empleando SASL
ldap_search -- Busca en un arbol LDAP
ldap_set_option -- Establece el valor de la opci贸n indicada
ldap_set_rebind_proc --  Indica la funci贸 de callback a utilizar en caso de tener que volver a realizar la autenticaci贸n con el servidor.
ldap_sort --  Ordena las entradas de un resultado de b煤squeda LDAP
ldap_start_tls --  Inicia TLS
ldap_t61_to_8859 --  Transforma caracteres en formato t61 a caracteres en formato 8859
ldap_unbind -- Desconectarse de un directorio LDAP