Authentification LDAP pour PHP (Linux - Debian)
Par Romain Tiennot le vendredi 27 mai 2011, 20:33 - Linux - Lien permanent
Cette article va montrer comment activer et utiliser l'authentification LDAP pour un intranet par exemple.
Dans un premier temps, nous avons besoin :
- Un domaine Windows avec une Active Directory
- D'une machine Linux intégré au domaine
- Un serveur LAMP (Linux Apache MySQL PHP) ou au minimum Apache et PHP.
Une fois votre linux intégré dans le domaine (Voir Article précedent) et votre serveur LAMP installé, vous devez télécharger et activer le module LDAP.
Télécharger et installer le module LDAP :
apt-get install php5-ldap
Activer le module :
a2enmod ldap
Puis relancer le serveur :
/etc/init.d/apache2 restart
Félicitation, vous pouvez utiliser l'authentification LDAP via PHP. Il ne vous reste plus qu'a coder quelque ligne en PHP. Vu que je suis gentil, voici un petit exemple d'authentification.
Dans mon cas, nous avons 5 services :
- Administration
- Direction
- Production 1
- Production 2
- Technique
Chaque service à une OU (Unité d'organisation) à son nom et deux sous OU nommé "Ordinateur" et "Utilisateur".
Seul les utilisateurs présent dans les OU's "Utilisateur" pourront se connecter via le LDAP et les autres se veront rejeté. Les utilisateurs présent dans l'OU "Technique","Utilisateur" auront des droits supplémentaire.
Pour cela, nous devons avoir deux Pages :
- Une page d'authentification (index.php)
- Une page qui se connecte au LDAP avec les identifiants (autorise.php)
La page "autorise.php" va récupérer les identifiants saisie (par exemple : "romain.tiennot"). Pour la connexion LDAP, on doit utiliser le "Nom" et non "identifiant de connexion" donc j'ai fait un "str_replace" pour remplacer le "." par " ". Avec les identifiants, il va essayer de vérifier si l'utilisateur est bien présent dans les OU et si son mot de passe est correcte.
Voici la page index.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Intranet</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" /> <meta http-equiv="content-language" content="fr" /> </head> <body> <FORM METHOD="POST" ACTION="autorise.php"> <TABLE WIDTH="100%"> <TR ALIGN="CENTER"> <TD>Login</TD> <TD><input type="texte" value="" name="login"/></TD> </TR> <TR ALIGN="CENTER"> <TD>Mot de passe</TD> <TD><input type="password" value="" name="password"/></TD> </TR> <TR ALIGN="CENTER"> <TD></TD> <TD><BR/><input type="submit" name="connection" value="Connection"</TD> </TR> </TABLE> </FORM> </body> </html>
Voici la page autorise.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Intranet</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" /> <meta http-equiv="content-language" content="fr" /> </head> <body> <?php // on récupère le login et le pass $user=$_POST['login']; $passwd=$_POST['password']; // Je remplace le "." (point) par " " (espace) car pour la verification LDAP il n'utilise pas les identifiants de connexion mais le "nom de connexion" $user = str_replace('.',' ',$user); // le nom de domaine facon : DC=DOMAIN,DC=LAN $ldap_base = 'dc=drinkevol,dc=lan'; // le nom de domaine facon : DOMAIN.LAN $ldap_server = 'drinkevol.lan'; // Le chemin de l'OU des utilsateurs de la direction avec la variable "$ldap_base" créé plus haut $ldap_direction = ",ou=Utilisateurs,ou=Service Direction,".$ldap_base; // Le chemin de l'OU des utilsateurs de la production1 avec la variable "$ldap_base" créé plus haut $ldap_production1 = ",ou=Utilisateurs,ou=Production 1,ou=Service Production,".$ldap_base; // Le chemin de l'OU des utilsateurs de la production2 avec la variable "$ldap_base" créé plus haut $ldap_production2 = ",ou=Utilisateurs,ou=Production 2,ou=Service Production,".$ldap_base; // Le chemin de l'OU des utilsateurs de l'informatique avec la variable "$ldap_base" créé plus haut $ldap_informatique = ",ou=Utilisateurs,ou=Service Informatique,".$ldap_base; // Le chemin de l'OU des utilsateurs de l'administration avec la variable "$ldap_base" créé plus haut $ldap_administratif = ",ou=Utilisateurs,ou=Service Administratif,".$ldap_base; // le port pour la connexion LDAP (par defaut 389) $ldap_port = '389'; // Création de la variable "$connexion_serveur" ou l'on indique les informations pour questionner la base $connexion_serveur = @ldap_connect($ldap_server, $ldap_port); // Si la connexion au LDAP fonctionne avec les identifiants saisie et que l'utilisateur se trouve dans l'OU "Utilisateur","Technique" alors on l'authorise avec les droits administrateurs if ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_informatique, $passwd)) { ?> <div class='news'> <H1>Bienvenue, <? echo ucwords($user)."."; ?><BR> Vous êtes administrateur</H1> </div> <?php $_SESSION['admin']=1; } // Sinon SI la connexion LDAP fonctionne avec les identifiants saisie et que l'utilisateur se trouve dans l'OU "Utilisateur", "Direction" ou "Utilisateur","Production2" etc... Alors on l'autorise avec les droits "Utilisateur" elseif (((($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_production1, $passwd)) or ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_production2, $passwd))) or ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_direction, $passwd))) or ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_administratif, $passwd))) { ?> <div class='news'> <H1>Bienvenue, <? echo ucwords($user)."."; ?> </div> <?php $_SESSION['admin']=2; } // Sinon, les identifiants sont peut etre mal saisie ou que l'utilisateur n'existe pas ou qu'il n'est pas dans la bonne OU. L'utilisateur se voit rejeter la connexion. else { ?> <div class='news'> <H1><? echo ucwords($user); ?>, vous n'etes pas authorisé</H1> <BR/><BR/><form><input type='button' value='Retour' onclick="self.location.href='index.php'"></form> </div> <?php $_SESSION['admin']=0; } ?> </body> </html>
Voici une petite démonstration :
A bientôt
Il y a 18 commentaires
Salut =)
ça ne marche pas, j'ai une page blanche sur la page autorise.php
Bonjour,
Vous pouvez m'envoyer vos codes ?
Ainsi que des informations sur votre domaine (Nom du domaine, arborescence ...)
Romain
ca ne march pa votre code et pourquoi il n'y pas de redirectionnement dans le code et pourtant il me semble que vous accéder à une autre page en cliquant sur connexion
Pour commercer, Bonjour,
Je ne comprend pas bien ton commentaire car il y a bien une validation de formulaire avec la balise <form> qui redirige vers la page autorise.php.
Ensuite, la page autorise.php qui va etablir une connexion LDAP puis vérifier si l'utilisateur est dans tel ou tel OU.
Peux-tu poster le code que tu as fais, j'y jetterais un coup d'oeil
Romain
Bonjour,
Je suis actuellement entrain de monter un portail pour l'intranet de mon entreprise, qui va taper sur l'annuaire LDAP pour connecter les utilisateurs, et j'aurais une question.
J'aimerais savoir comment spécifier que l'on veut identifier quelqu'un grâce à son attribut sAMAccountType + son mot de passe.
Par exemple pour le :
$connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_informatique, $passwd))
ldap_bind renvoie valeur != 0 si il réussi à lier le couple user/mdp c'est bien ca ? mais je ne voudrais pas vérifier le login par défaut.
Merci d'avance pour vos suggestions
Cdt,
Alexandre
Bonjour Alexandre,
Dans l'exemple que j'ai donné, il va etablir une connexion LDAP avec un compte. Ensuite, il va vérifier si les identifiants que l'utilisateur a saisit font partie ou non d'une OU que je lui aurait spécifié. En fonction, il aura les droits admins, utilisateur ou il n'arriva pas à se connecter.
Si l'utilisateur existe et que le mot de passe est correcte alors il tel droit.Je fais cette vérification avec cette ligne :
Bonjour Romain,
Je suis d'accord avec ca, mais chez moi cela ne fonctionne pas
Ca doit surement être à cause de mon openldap client qui est mal configuré sur ma machine CentOS.
J'hoste mes pages de login sur un apache de cette même machine. je ne sais pas si vous connaissez la configuration à changer sur une CentOS ?
Apparemment ça serait un slapd.conf à modifier dans /etc/openldap. Ce que j'ai fait en me basant sur un modèle, sans succès ...
Je vous remercie d'avance pour votre réponse !
Cdt,
Alexandre
C'est bon j'ai trouvé la solution, j'avais simplement inversé le sens de l'arborescence des OU dans mon ldap_bind().
J'avais mis
$ldap_informatique=",ou=Site,ou=Informatique,".$ldap_base; </code> au lieu de
$ldap_informatique=",ou=Informatique,ou=Site,".$ldap_base; à l'affectation de mes variables.
Cdt,
Alexandre
Parfait !
Tu m'en vois ravie !
Romain
Bonjour
Je vous remercie pour votre code mais vous pouvez me dire SVP qu'est ce que je dois modifier pour permettre simplement les utilisateurs à s'authentifier ( pas de admins)
Je vous remercie d'avance
bjr,
J'ai bien suivi vos tutos et mon serveur linux est bien present dans mon domaine windows
j'arrive a lire les infos users + groupes sans probleme depuis le serveur linux
mais en implantant ce code l'authentification ldap ne se fait pas, j'ai toujours le message user inconnu qui s'affiche (j'ai l'impression qu'il ne contacte meme pas le serveur ldap)
Votre dc windows est-il en 2008 R2? y'a t il des parametres a changer pour un 2008?
merci pour votre aide
Bonjour Romain,
J'ai une connexion ldap fonctionnel. Par contre je chercher à modifier un mot de passe dans un AD via php.
Je dois passer par une connexion sécurisé.
As-tu des pistes sur le sujet ?
Je bloque sur l'erreur LDAP bind failed
Bonjour,
je suis actuellement de refaire un site intranet pour une entreprise.
Il y a quelques jours j’arrive a me connecter a ce site intranet avec un utilisateur de LDAP et la depuis un certain temps quand j'essaie de me connecte cela m affiche mot de passe ou nom incorrect alors que j'ai exactement repris l'utilisateur de LDAP.
pouvez_vous m'aider je comprend pour quoi ça m'affiche cela
cordialement
Bonjour,
Peut on faire une authentification automatique ( sans saisir login passe mais qu'il récupère la session windows en cours client ) ?
Cordialement
@BenDu47
Pour faire du SSO (Single Sign-On) sous Windows cela s'appelle le NTLM.
Tu peux activer le NTLM sur différents navigateurs avec des plugins et/ou les fichiers de conf de ceux-ci. Par ex pour Firefox :
http://www.liquidstate.net/blog/tec...
Et si tu fais ca en PHP, tu peux directement utiliser le NTLM comme ca :
http://www.commentcamarche.net/foru...
A +
bonjour,
très bon tuto...
en revanche j'ai un soucis sur l'authentification des comptes. toujours le même message "toto, vous n'êtes pas autorisé", or il existe bien dans les bonnes OU.
en revanche pas d'AD mais serveur dns et ldap sous debian 7.
une aide serai la bienvenue
Bonjour,
Le Bind se fait avec le DN du super utilisateur !! ça passe pas avec celui des utilisateurs, comment puis je faire pour résoudre ce problème ?
Bonjour Merci pour ce tuto, je suis en train de réaliser un site web et j’aimerais faire une authentification automatique pour les utilisateurs du domaine et une simple authentification pour les autres NB: je suis sous le framework Codeigniter Merci d'avance