|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PHP - Administration d'un annuaire LDAPIntroduction à LDAPPHP permet la connexion et l'envoi de requêtes sur un annuaire LDAP, c'est-à-dire un serveur permettant de stocker des informations de manière hiérarchique. Pour plus d'informations sur les fonctions LDAP de PHP, reportez-vous à l'article consacré à ce sujet
Dans le cadre de cet article, on se propose d'écrire un interface d'administration
pour un annuaire. On va prévoir les actions de base, c'est à dire : ajouter, modifier
et supprimer des éléments de notre annuaire LDAP.
Dans chaque module, on va avoir besoin d'un certain nombre de variables qui caractérisent le serveur LDAP. On va donc créer un fichier de configuration externe qui sera chargé au démarrage de chaque module. De cette façon, lorsque vous voulez installer votre application sur une autre plate-forme, vous ne devez modifier que ce fichier de configuration. De plus, on va prévoir la possibilité de modifier le modèle d'affichage, c'est à dire l'apparence de votre interface. On utilisera donc deux fichiers :
Sécurisation de l'interfaceOn supposera que l'ensemble des pages PHP créées dans ce tutorial se trouvent sous le répertoires ldap_admin/. Nous allons donc protéger le répertoire ldap_admin/ qui contiendra les pages d'administration de notre annuaire. Chaque utilisateur qui voudra accéder à ces pages devra s'authentifier. Nous utilisons la méthode des fichiers .htaccess. On va ainsi définir que seul l'utilisateur ldap_admin peut accéder à l'interface d'administration du forum. On va dans un premier temps créer le fichier des utilisateurs. Placez-vous dans le répertoire ldap_admin et exécuter la commande suivante pour créer ce fichier (pour les utilisateurs de Linux) : htpasswd -c ldap_admin.passwd ldap_admin
New password:On confirme. Re-type new password:Une fois que le fichier des utilisateurs est généré, on va créer le fichier .htaccess qui sera stocké dans le répertoire à protéger, ici ldap_admin/. On protège aussi le fichier de configuration : <Files config_LDAP.inc.php3> Order Deny,Allow Deny From All </Files> AuthUserFile /home/httpd/html/services/ldap_admin/ldap_admin.passwd AuthName "Acces Restreint" AuthType Basic <Limit GET POST> require valid-user </Limit>La sécurisation de notre interface est maintenant terminée. Fichier de configurationCommençons par commenter le fichier de configuration nommé config_LDAP.inc.php3 : <? // Fichier de configuration pour l'interface PHP pour administrer // notre annuaire LDAP $server = "localhost"; $port = "389"; $racine = "o=commentcamarche, c=fr"; $rootdn = "cn=ldap_admin, o=commentcamarche, c=fr"; $rootpw = "secret"; ?>On définit donc cinq variables pour caractériser le serveur LDAP : le nom du serveur, le port (389 par défaut), la racine supérieure de l'arborescence, la chaîne de connexion pour l'administrateur ainsi que son mot de passe. Le fichier de configuration sera automatiquement appelé par le fichier header.php3 qui définit le haut de notre interface. L'interface PHP/LDAPDétaillons maintenant le fichier admin.php3 qui est la page principale de notre interface :
Cette page liste les personnes saisies dans l'annuaire et propose soit de les modifier soit de les supprimer. Elle propose aussi un lien en bas de page pour ajouter une nouvelle personne. Du point du vue du code source, elle ne comporte aucune grosse complexité.
Ensuite, la fonction ldap_search permet de rechercher tous les objets de type person et de les afficher avec une boucle de type « for » sous la forme d'un tableau en ajoutant deux liens qui correspondent respectivement à la modification et à la suppression. Pour la modification, la page modifie.php3 est appelée. On lui passe en paramètre la valeur de cn contenue dans l'annuaire, qui correspond au nom concaténé au prénom. La même chose est réalisée pour le lien concernant la suppression sauf que la page supprime.php3 est appelée. Le paramètre cn est encodé avec la fonction urlencode() de façon à transformer cette chaîne de caractère en une chaîne compatible avec le format des URL. Ainsi les espaces seront par exemple remplacés par des « + ». <? // affichage du haut de la page contenu dans le fichier header.php3 require("header.php3"); echo "Les personnes suivantes sont inscrites dans l'annuaire :<p>"; // connexion au serveur LDAP : ds est égal à 1 si la connexion est OK $ds=ldap_connect($server); if ($ds==1) { // on recherche les objet de type person à partir de la racine // de notre serveur LDAP, ici : o=commentcamarche, c=fr $sr=ldap_search($ds, $racine, "objectclass=person"); $info = ldap_get_entries($ds, $sr); echo "<table border=1>"; echo "<tr> <th>Nom et prénom</th> <th>Adresse e-Mail </th> <th>Téléphone</th> </tr>"; // on affiche sous forme d'un tableau les personnes enregistrées // dans l'annuaire avec un lien pour modifier et un lien pour supprimer for ($i=0;$i<$info["count"];$i++) { $mynom = $info[$i]["cn"][0]; $myemail = $info[$i]["mail"][0]; $mytel = $info[$i]["telephonenumber"][0]; echo" <tr><th>$mynom</th><th> <A HREF=mailto:$myemail>$myemail</a></th><th>$mytel</th>"; $mynom=urlencode($mynom); echo" <th><a href=\"modifie.php3?cn=$mynom\"> Modifier</a></th>"; echo" <th><a href=\"supprime.php3?cn=$mynom\"> Supprimer</a></th></tr>"; } echo"</table>"; echo "<center>< br><a href=\"ajoute.php3\">Ajouter une nouvelle personne dans l'annuaire</a></center>"; } // on ferme la connexion au serveur LDAP ldap_close($ds); // on affiche le bas de page défini dans le fichier footer.php3 require("footer.php3"); ?> Ajout d'une entrée à LDAPContinuons avec la page ajoute.php3 qui est utilisée pour ajouter de nouvelles personnes dans notre annuaire :
Sur la copie d'écran, vous pouvez constater sur le haut et bas de page est exactement le
même que sur notre page principale (dû à l'utilisation des fichiers header.php3 et
footer.php3). La page est constituée d'un formulaire avec des champs obligatoires.
Vous retrouvez les boutons standards pour valider ou annuler votre nouvelle saisie.
Pour essayer de garder toute la fonction « ajouter » dans la même page
(formulaire et enregistrement), on introduit une variable go
qui détermine si la page est appellée pour la première fois ou si elle est rappellée
après la validation du formulaire.
Si la variable go est égale à 1 et que les champs nom, prénom et mail
ne sont pas vides, on peut alors enregistrer la nouvelle personne dans l'annuaire.
Sinon, on affiche le formulaire de saisie avec un message d'erreur si l'on a validé le formulaire sans avoir rempli les champs obligatoires. <? // on affiche le haut de la page contenu dans le fichier header.php3 require("header.php3"); if (($go==1) and ($nom!="") and ($prenom!="") and ($mail!="")) { $ds=ldap_connect($server); if ($ds==1) { // on s'authentifie en tant que super-utilisateur, ici, ldap_admin $r=ldap_bind($ds,$rootdn,$rootpw); // préparation des données $info["cn"]=$nom." ".$prenom; $info["mail"]=$mail; $info["telephonenumber"]=$tel; $info["objectclass"]="person"; // ajout dans l'annuaire $r=ldap_add($ds,"cn=$nom $prenom,$racine",$info); // fermeture de la connexion ldap_close($ds); $go==0; $nom==""; $prenom=""; $mail=""; $tel=""; echo "L'enregistrement a réussi !!!\n"; echo "<P><A HREF=\"ajoute.php3\">Ajouter une nouvelle personne</A>\n"; echo "<P><A HREF=\"admin.php3\">Retourner à la page d'administration</A>\n"; } } else { if ($go==1) { $mes="ERREUR ! Vous devez obligatoirement remplir les champs en gras"; echo "<FONT COLOR=FF0000>$mes</FONT>\n"; } echo "<FORM ACTION=\"ajoute.php3\" METHOD=POST>\n"; echo "<TABLE BORDER=0>\n"; echo quot;<TR><TD> <B>Nom</B></TD>\n"; echo "<TD><INPUT TYPE=\"text\" NAME=\"nom\" value=\"$nom\" SIZE=30 maxlength=80><BR></TD></TR>\n"; echo "<TR><TD> <B>Prénom</B></TD>\n"; echo "<TD><INPUT TYPE=\"text\" NAME=\"prenom\" value=\"$prenom\" SIZE=30 maxlength=80><BR></TD></TR>\n"; echo "<TR><TD> <B>E-Mail</B></TD>\n"; echo "<TD><INPUT TYPE=\"text\" NAME=\"mail\" value=\"$mail\" SIZE=40 maxlength=80><BR></TD></TR>\n"; echo "<TR><TD> Téléphone</TD>\n"; echo "<TD><INPUT TYPE=\"text\" NAME=\"tel\" value=\"$tel\" SIZE=40 maxlength=255><BR></TD></TR>\n"; echo "</TABLE>\n"; echo "<INPUT type=\"hidden\" name=\"go\" value=\"1\"><BR><BR>\n"; echo "<INPUT type=\"submit\" value=\"Valider\">\n"; echo "<INPUT type=\"reset\" value=\"Annuler\">\n"; echo "</FORM>\n"; echo "<BR>Les champs en <B>gras</B> sont obligatoires.\n"; } // on affiche le bas de la page contenu dans le fichier footer.php3 require("footer.php3"); ?> Modification d'une entrée de l'annuaire LDAPRegardons maintenant le source (plus long mais pas plus complexe !) de la page modifie.php3. Le nom et le prénom étant concaténé dans le champ cn de l'annuaire, il sera impossible de faire une modification sur le nom ou sur le prénom.
Pour modifier une personne, il faut d'abord la supprimer (avec ldap_delete())
puis la réenregistrer avec les nouvelles valeurs.
<? // on affiche le haut de la page contenu dans le fichier header.php3 require("header.php3"); $cn=urldecode($cn); if (($go==1) and ($mail!="")) { // connexion au serveur $ds=ldap_connect($server); if ($ds==1) { // on s'authentifie en tant que super-utilisateur, ici, ldap_admin $r=ldap_bind($ds,$rootdn,$rootpw); // Suppression de l'ancien enregistrement $r=ldap_delete($ds,"cn=$cn,$racine"); // Préparation des données $info["cn"]=$cn; $info["mail"]=$mail; $info["telephonenumber"]=$tel; $info["objectclass"]="person"; // Ajout dans l'annuaire $r=ldap_add($ds,"cn=$cn,$racine",$info); // fermeture de la connexion à l'annuaire LDAP ldap_close($ds); $go==0; $nom==""; $prenom=""; $mail=""; $tel=""; echo "La modification a réussi !!!\n"; echo "<P><A HREF=\"admin.php3\">Retourner à la page d'administration</A>\n"; } } else { if ($go==1) { $mes="ERREUR ! Vous devez obligatoirement remplir le champ mail"; echo "<FONT COLOR=FF0000>$mes</FONT>\n"; } // connexion au serveur $ds=ldap_connect($server); if ($ds) { $recherche="cn=$cn"; $champs = array("cn", "telephonenumber", "mail"); // recherche les informations de la personne que l'on veut modifier $sr=ldap_search($ds, $racine, $recherche, $champs); $num= ldap_get_entries($ds,$sr); if ($num["count"]>0) { $mynom = $num[0]["cn"][0]; $myemail = $num[0]["mail"][0]; $mytel = $num[0]["telephonenumber"][0]; echo "<FORM ACTION=\"modifie.php3\" METHOD=POST>\n"; echo "<TABLE BORDER=0>\n"; echo "<TR><TD> <B>Modification de l'utilisateur : $cn</B></TD>\n"; echo "<TR><TD> <B>E-Mail</B></TD>\n"; echo "<TD><INPUT TYPE=\"text\" NAME=\"mail\" value=\"$myemail\" SIZE=40 maxlength=80><BR></TD></TR>\n"; echo "<TR><TD> Téléphone</TD>\n"; echo "<TD><INPUT TYPE=\"text\" NAME=\"tel\" value=\"$mytel\" SIZE=40 maxlength=255><BR></TD></TR>\n"; echo "</TABLE>\n"; echo "<INPUT type=\"hidden\" name=\"cn\" value=\"$cn\"><BR><BR>\n"; echo "<INPUT type=\"hidden\" name=\"go\" value=\"1\"><BR><BR>\n"; echo "<INPUT type=\"submit\" value=\"Modifier\">\n"; echo "<INPUT type=\"reset\" value=\"Annuler\">\n"; echo "</FORM>\n"; echo "<BR>Le champ <B>mail</B> est obligatoire.\n"; } else { echo "Erreur ! La recherche n'a pas aboutie"; } } else { echo "Erreur ! Problème à la connexion avec le serveur LDAP"; } } require("footer.php3"); ?> Suppression d'une entrée de l'annuaire LDAPOn termine enfin avec la page supprime.php3 qui, avant de supprimer, va demander une confirmation.
Si on confirme, on rappelle la page supprime.php3 avec le paramètre go=1.
<? // on affiche le haut de la page contenu dans le fichier header.php3 require("header.php3"); $cn=urldecode($cn); if ($go==0) { echo "Etes-vous sur de vouloir supprimer l'utilisateur $cn<br>\n"; $cn=urlencode($cn); echo "<A HREF=\"supprime.php3?go=1&cn=$cn\">oui</A><BR>\n"; echo "<A HREF=\"admin.php3\">non</A><BR>\n"; } else { $cn=urldecode($cn); // connexion au serveur LDAP $ds=ldap_connect($server); if ($ds==1) { // on s'authentifie en tant que super-utilisateur, ici, ldap_admin $r=ldap_bind($ds,$rootdn,$rootpw); // Suppression de l'ancien enregistrement $r=ldap_delete($ds,"cn=$cn,$racine"); echo "La suppression a réussi !!!\n"; echo "<P><A HREF=\"admin.php3\">Retourner à la page d'administration</A>\n"; } } // on affiche le bas de la page contenu dans le fichier footer.php3 require("footer.php3"); ?> Modification d'une entrée de l'annuaire LDAPVous voilà prêt à administrer votre annuaire... ou à construire votre propre interface d'administration. Pour un souci de simplicité, seules les fonctionnalités de base ont été implémentées. Une page pour rechercher une personne pourrait aussi être écrite.
Les sources sont commentés de façon à vous aider à concevoir de nouveaux programmes en PHP. Article écrit par Michel Maudet et Jean-François Pillou Trucs & astuces pertinents trouvés dans la base de connaissances
Discussions pertinentes trouvées dans le forum
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||