ldapDémarrer avec ldap

Remarques

Cette section fournit une vue d'ensemble de ce qu'est ldap et des raisons pour lesquelles un développeur peut vouloir l'utiliser.

Il devrait également mentionner tous les grands sujets dans ldap et établir un lien avec les sujets connexes. La documentation de ldap étant nouvelle, vous devrez peut-être créer des versions initiales de ces rubriques connexes.

Configurer PHP pour fonctionner avec LDAP

Après avoir configuré votre serveur LDAP correctement, nous souhaitons maintenant nous connecter. Par exemple en utilisant PHP.

  • DN = nom distinctif. Cela signifie que dans quelle partie de la base de données travaillez-vous? Peut être un utilisateur ou un groupe (ou même des paramètres de configuration).
  • Entrée: une entité, par exemple un utilisateur.
  • Attribut: quelque chose à l'intérieur d'une entrée, par exemple le nom, le numéro de téléphone et l'adresse e-mail.

De liaison

Tout d'abord, nous définissons les éléments suivants:

$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

Maintenant, nous sommes connectés. La prochaine chose que nous voulons, c'est de faire savoir au serveur que nous sommes une personne de confiance. La solution la plus simple consiste à utiliser le nom distinctif racine OU un utilisateur existant disposant des autorisations appropriées pour afficher la base de données (chaque utilisateur de la base de données peut probablement le faire par défaut). Nous nous authentifions en utilisant la fonction bind.

Définir les options

Tout d'abord, nous déclarons ces options. Selon votre configuration de serveur, vous pouvez laisser ceci de côté.

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

Contraignant

Supposons que vous utilisez admin et mot de passe est 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

C'est très bien. Nous sommes dans. Maintenant, nous pouvons effectuer beaucoup d'opérations différentes. Par exemple, nous pouvons rechercher, lire, écrire et modifier des utilisateurs et même des groupes.

Recherche

Imaginons que nous voulions afficher tous les membres du groupe "utilisateurs".

$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. 

Vous pouvez utiliser des boucles foreach pour afficher les données d'une manière agréable.

Okay, c'est ça? Maintenant, procédez à un filtrage. Nous voulons afficher uniquement les utilisateurs du groupe "propriétaires de vélo" qui ont enregistré une adresse e-mail. Il est important de savoir que tous les utilisateurs sont dans cn = users. À côté de cela, ils peuvent également être membres d'autres groupes.

//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

Et maintenant, continuez avec ldap_get_entries nouveau.

Efficacité dans l'obtention d'entrées

Un exemple dans lequel l'efficacité est abordée, de plus en plus importante avec les grandes bases de données avec beaucoup d'attributs par entrée. En particulier lorsque vous stockez des images dans l'attribut jpegphoto, cela peut réduire considérablement votre temps de chargement lorsque vous tirez sélectivement vos entrées.

Imaginons que nous cherchions des utilisateurs appartenant au groupe "propriétaires de vélo". Il y a beaucoup d'informations stockées dans ces entrées, disons qu'elles ont les attributs suivants: cn, uid, nom, nom d'affichage, mail, initiales, mobile, numéro de téléphone, rue, adresse postale, code postal et jpegphoto. Maintenant, nous avons seulement besoin de leur nom, prénom et initiales.

Pour cela, nous utilisons un 4ème paramètre facultatif 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

Et voilà, ldap_get_entries ne vous donnera que ces données.

Filtrage avancé

Bien sûr, vous pouvez extraire une base de données complète avec LDAP et traiter ceci en PHP. Cependant, tout comme avec MySQL, il est beaucoup plus efficace de traiter le côté serveur. Pour démontrer cela, nous pouvons utiliser un filtre avancé.

Prenez l'un des exemples ci-dessus comme point de départ, mais changez $ filter selon la ligne ci-dessous. Dans notre exemple, nous voulons afficher les données des utilisateurs actifs. Normalement, l'attribut shadowexpire est utilisé pour stocker ces informations. Cependant, cela peut différer selon les différents systèmes LDAP. Non seulement nous voulons afficher les utilisateurs qui sont actifs, mais aussi leur nom doit commencer par un « a » et ils doivent vivre à Amsterdam.

Fondamentalement, nous voulons faire trois choses:

  1. Le plus simple: vivre à Amsterdam. Dans cet exemple, le lieu de résidence est enregistré dans l'attribut «adresse postale»
$filter= "postaladdress=Amsterdam";
  1. Le nom doit commencer par un "a". Dans cet exemple, UID est composé du nom, donc:
$filter= "uid=a*";
  1. L'utilisateur doit être actif. Cette valeur est stockée dans l'attribut par défaut shadowexpire , avec la valeur -1 . Selon la configuration de votre serveur, shadowexpire peut contenir une multitude de valeurs, même les dates sont possibles. Si un utilisateur est inactif, shadowexpire sera 1 . Pour être sûr que nous obtenons tous les utilisateurs sauf ceux qui sont vraiment inactifs, nous ne choisissons pas de filtrer sur shadowexpire = -1 . Au lieu de cela, nous disons que nous ne voulons pas qu’ils soient inactifs.
$filter= "(!(shadowexpire=1))"; //NOT is represented with "!"

Maintenant, la partie la plus intéressante: combiner les trois exemples. Nous pouvons le faire avec des parenthèses, des expressions AND, OR et NOT

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

Enfin, nous pourrions construire une instruction OR en utilisant "|", par exemple si nous voulons que tous les utilisateurs commencent par "a" ou "b"

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

Vous pouvez combiner à l'infini et construire des filtres assez impressionnants.