Romain Tiennot

Technicien Superieur en Informatique

Aller au contenu | Aller au menu | Aller à la recherche

Keyword - Apache

Fil des billets

Debian - Single Sign-On avec Apache

Debian Domain

Lire la suite...

Authentification LDAP pour PHP (Linux - Debian)

php_ldap.jpg 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