Premiers pas avec ldap
Sur cette page
Configurer PHP pour qu’il fonctionne avec LDAP
Après avoir correctement configuré votre serveur LDAP, nous voulons maintenant nous connecter. Par exemple en utilisant PHP.
- DN = nom distinctif. Cela signifie, dans quelle partie de la base de données Est-ce que vous travaillez. 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’un saisie, par exemple nom, numéro de téléphone et adresse e-mail.
De liaison
Premièrement, nous définissons ce qui suit :
$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 faire savoir au serveur que nous sommes une personne digne de confiance. La solution la plus simple consiste à utiliser le DN racine OU un utilisateur existant disposant des autorisations appropriées pour afficher la base de données (probablement chaque utilisateur de la base de données peut le faire par défaut). Nous nous authentifions à l’aide de la fonction bind.
Définir les options
Tout d’abord, nous déclarons ces options. Selon la configuration de votre serveur, vous pouvez laisser cela de côté.
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
Obligatoire
Supposons que vous utilisez admin et que le 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 y sommes. Nous pouvons maintenant effectuer de nombreuses 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 “users”.
$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 de manière agréable.
D’accord, compris ? Procédez maintenant à un certain filtrage. Nous souhaitons afficher uniquement les utilisateurs du groupe “propriétaires de vélos” qui ont enregistré une adresse e-mail. Il est important de savoir que tous les utilisateurs sont dans cn=users. A 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 des entrées
Un exemple dans lequel l’efficacité est abordée, de plus en plus importante avec de grandes bases de données avec beaucoup d’attributs par entrée. Surtout lorsque vous stockez des images dans l’attribut jpegphoto, cela peut réduire considérablement votre temps de chargement lorsque vous extrayez sélectivement vos entrées.
Imaginons que nous voulions rechercher des utilisateurs appartenant au groupe “propriétaires de vélos”. 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, courrier, initiales, mobile, numéro de téléphone, rue, adresse postale, code postal et jpegphoto. Maintenant, nous n’avons besoin que de leur uid, de leur nom et de leurs initiales.
Pour cela, nous utilisons un 4ème paramètre optionnel 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à, exécuter ldap_get_entries
ne vous donnera que ces données.
Filtrage avancé
Bien sûr, vous pouvez extraire une base de données entière avec LDAP et la traiter davantage en PHP. Cependant, tout comme avec MySQL, il est beaucoup plus efficace de faire le traitement côté serveur. Pour le démontrer, nous pouvons utiliser un filtre avancé.
Prenez l’un des exemples ci-dessus comme point de départ, mais modifiez $filter en fonction de la ligne ci-dessous. Dans notre exemple, nous voulons afficher les données des utilisateurs qui sont 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 également leur nom doit commencer par un “a” et ils doivent vivre à Amsterdam.
Fondamentalement, nous voulons faire trois choses :
-
Le plus simple : doit vivre à Amsterdam. Dans cet exemple, le lieu de résidence est stocké dans l’attribut ‘postaladdress’
$filter= “postaladdress=Amsterdam”;
-
Le nom doit commencer par un “a”. Dans cet exemple, l’UID est composé à partir du nom, donc :
$filter= “uid=a*”;
-
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 myriade de valeurs, même des dates sont possibles. Si un utilisateur est inactif,shadowexpire
sera1
. Pour être sûr d’avoir tous les utilisateurs à l’exception de ceux qui sont vraiment inactifs, nous ne choisissons pas de filtrer surshadowexpire = -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 : combinez les trois exemples. Nous pouvons le faire avec des crochets, des expressions AND, OR et NOT
$filter= "(&(postaladdress=Amsterdam)(uid=a*)(!(shadowexpire=1)))";
Enfin, nous pourrions créer 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 créer des filtres assez impressionnants, profitez-en !