Primeros pasos con ldap

Configurando PHP para trabajar con LDAP

Después de configurar su servidor LDAP correctamente, ahora queremos conectarnos. Por ejemplo, usando PHP.

  • DN = nombre distinguido. Esto significa, en qué parte de la base de datos estás trabajando. Puede ser un usuario o un grupo (o incluso ajustes de configuración).
  • Entrada: una entidad, por ejemplo un usuario.
  • Atributo: algo dentro de un entrada, por ejemplo, nombre, número de teléfono y dirección de correo electrónico.

Conectando

Primero, definimos lo siguiente:

$server = "server.example.com";  //this is the LDAP server you're connecting with
$ds = ldap_connect("ldaps://$server", 636); //always connect securely via LDAPS when possible

Ahora, estamos conectados. Lo siguiente que queremos es que el servidor sepa que somos una persona confiable. La solución más sencilla es utilizar el DN raíz O un usuario existente con los permisos adecuados para ver la base de datos (probablemente todos los usuarios de la base de datos puedan hacerlo de forma predeterminada). Nos autenticamos usando la función bind.

Establecer opciones

Primero, declaramos estas opciones. Dependiendo de la configuración de su servidor, puede omitir esto.

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

Unión

Suponga que está usando admin y la contraseña es pass123notsafe

$dn = "uid=admin,cn=users,dc=server,dc=example,dc=com";
$pass = "pass123notsafe";
$ldapbind = ldap_bind($ds, $dn, $pass); //this is the point we are authenticating

Eso es muy bueno. Estamos adentro. Ahora podemos realizar muchas operaciones diferentes. Por ejemplo, podemos buscar, leer, escribir y modificar usuarios e incluso grupos.

Buscando

Imagina que queremos mostrar todos los miembros del grupo “usuarios”.

$dn = "cn=users,dc=server,dc=example,dc=com"; //very important: in which part of your database are you looking
$filter = "uid=*"; //don't filter anyone out (every user has a uid)
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

$results = ldap_get_entries($ds, $sr); //here we are pulling the actual entries from the search we just defined
var_dump($results); //will give you all results is array form. 

Puede usar bucles foreach para mostrar los datos de una manera agradable.

Bien, ¿entendido? Ahora proceda con un poco de filtrado. Queremos mostrar solo los usuarios del grupo “propietarios de bicicletas” que hayan registrado una dirección de correo electrónico. Es importante saber que todos los usuarios están en cn=users. Además de esto, también pueden ser miembros de otros grupos.

//did the connecting and binding

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com"; //note the extra "cn=groups" for looking in a group that is not "users"
$filter = "email=*"; //email address must be set but can be anything
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

Y ahora proceda con ldap_get_entries nuevamente.

Eficiencia en la obtención de entradas

Un ejemplo en el que se aborda la eficiencia, cada vez más importante con grandes bases de datos con muchos atributos por entrada. Especialmente cuando almacena imágenes en el atributo jpegphoto, puede reducir significativamente su tiempo de carga cuando extrae selectivamente sus entradas.

Imagina que queremos buscar usuarios que estén en el grupo “propietarios de bicicletas”. Hay mucha información almacenada dentro de estas entradas, digamos que tienen los siguientes atributos: cn, uid, nombre, nombre para mostrar, correo, iniciales, móvil, número de teléfono, calle, dirección postal, código postal y jpegphoto. Ahora solo necesitamos su uid, nombre e iniciales.

Para esto, usamos un cuarto parámetro opcional de ldap_search:

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com";
$filter = "uid=*"; //
$justhese = array("uid", "name", "initials");
$sr = ldap_search($ds, $dn, $filter, $justthese) or die ("bummer"); //define your search scope

Y listo, ejecutar ldap_get_entries solo te dará estos datos.

Filtrado avanzado

Por supuesto, puede extraer una base de datos completa con LDAP y procesarla más en PHP. Sin embargo, al igual que con MySQL, es mucho más eficiente realizar el procesamiento del lado del servidor. Para demostrar esto, podemos usar un filtro avanzado.

Tome uno de los ejemplos anteriores como punto de partida, pero cambie $filter de acuerdo con la línea a continuación. En nuestro ejemplo, queremos mostrar los datos de los usuarios que están activos. Normalmente, el atributo shadowexpire se usa para almacenar esta información. Sin embargo, esto puede diferir entre varios sistemas LDAP. No solo queremos mostrar los usuarios que están activos, sino que también su nombre debe comenzar con una “a” y deben vivir en Ámsterdam.

Básicamente queremos hacer tres cosas:

  1. Más fácil: debe vivir en Amsterdam. En este ejemplo, el lugar de residencia se almacena en el atributo ‘postaladdress’

    $filter= “postaladdress=Amsterdam”;

  2. El nombre debe comenzar con una “a”. En este ejemplo, el UID se compone del nombre, por lo que:

    $filter= “uid=a*”;

  3. El usuario debe estar activo. Este valor se almacena en el atributo predeterminado shadowexpire, con el valor -1. Dependiendo de la configuración de su servidor, shadowexpire puede contener una miríada de valores, incluso las fechas son posibles. Si un usuario está inactivo, shadowexpire será 1. Para asegurarnos de obtener todos los usuarios excepto aquellos que están realmente inactivos, no elegimos filtrar por shadowexpire = -1. En cambio, decimos que no queremos que estén inactivos.

    $filter= “(!(shadowexpire=1))”; //NOT is represented with “!”

Ahora la parte más interesante: combinar los tres ejemplos. Podemos hacer esto con corchetes, expresiones AND, OR y NOT

$filter= "(&(postaladdress=Amsterdam)(uid=a*)(!(shadowexpire=1)))";

Finalmente, podríamos construir una declaración OR usando “|”, por ejemplo, si queremos que todos los usuarios comiencen con “a” o “b”.

$filter= "(|(uid=a*)(uid=n*))";

Puedes combinar infinitamente y construir filtros bastante impresionantes, ¡disfruta intentándolo!