Class ldap et connexion à deux serveur dont un de secour...

Contenu du snippet

Ce code sert à simplifier l'utilisation de LDAP par la methode objet
Malheureusement je travaille en php 4.0. donc pas de super class comme en php5 mais ca viendra

L'exemple nous montre une utilisation de cette class pour l'identification dans un cas assez complexe vu que je dispose de deux serveursun principal et un de secours

Source / Exemple :


<?php
/* Fichier : LDAP.class.php */
// Création de la classe
class LDAP
{
	// Attribut du login du LDAP
	var $LDAP_login;
	// Attribut du password du LDAP
	var $LDAP_password;
	// Attribut de l'hôte du LDAP
	var $LDAP_host;
	// Attribut de connection
	var $connect;
	//Identification
	var $identification;

	// Définition du constructeur
	function LDAP($login, $password, $host)
	{
		// Vérification des variables
		if (empty ($login) || empty ($host) || empty ($password)){
		// Affichage du message d'erreur
		//echo "<b>Erreur :</b> Une ou plusieurs variable(s) n'ont pas été renseigné.<br>Procédure interrompu";
		exit;
		}
		else {
			// Initialisation des attributs
			$this->LDAP_login = $login;
			$this->LDAP_password = $password;
			$this->LDAP_host = $host;
		}
	}
	
	//fonction de connection
	function connect()
	{
		// Connection à LDAP
		$this->connect = @ldap_connect($this->LDAP_host);
		// Vérification de la connection
		if (!$this->connect){
			// Affichage du message d'erreur
			//echo "<b>Erreur :</b> Connection au serveur impossible impossible<br>";
			return false;
		}else{
			return true;
		}
		// Initialisation de l'attribut de connection
	}
	
	// Méthode Identification()
	function identification ()
	{
		// Exécution de l'identification
		$ident = @ldap_bind($this->connect, $this->LDAP_login, $this->LDAP_password);
		//Vérification de la connection
		if ($ident) {
			$this->identification = $ident;
			return true;
	    } else {
    	    //echo "Echec d'identification<br>";
			return false;
	    }
    }
	
	//fonction recherche
	// Attention le serveur est configurer pourne pas tolerer plus de 200 réponses a la requete
	// temps de recherche maximale 2 secondes
	function recherche($Nom)
	{
		echo 'Recherchons (sn='.$Nom.') ...';
		// Recherche par nom
		$search = ldap_search($this->connect, 'o="à compléter", c=fr', "sn=$Nom");  		echo 'Le résultat de la recherche est ' . $search . '<br />';
	
		echo 'Le nombre d\'entrées retournées est ' . ldap_count_entries($this->connect,$search) . '<br />';

		echo 'Lecture des entrées ...<br />';
		$info = ldap_get_entries($this->connect, $search);
		echo 'Données pour ' . $info["count"] . ' entrées:<br />';
	
		for ($i=0; $i<$info["count"]; $i++) {
			echo 'dn est : ' . $info[$i]["dn"] . '<br />';
			echo 'premiere entree cn : ' . $info[$i]["cn"][0] . '<br />';
			echo 'premiere entree sn : ' . $info[$i]["sn"][0] . '<br />';
			echo 'premier email : ' . $info[$i]["mail"][0] . '<br />';
			echo 'premier givenName : ' . $info[$i]["givenName"][0] . '<br />';
			echo 'premier uid : ' . $info[$i]["uid"][0] . '<br />';
		}
	}

	// Méthode deconnect()
	function deconnect (){
		// Déconnection
		$deconnect = ldap_unbind($this->connect);
		if(!$deconnect)
			ldap_close($this->connect);//c les bretelles et la ceinture :)
	}//fin de déconnexion
}//fin de class
?>
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------EXEMPLE-------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
<?php
$annu1 = "";	//Annuaire Principal
$annu2 = "";	//Annuaire de secours
//inclusion de la classe LDAP
include "./Commun/LDAP/LDAP.class.php";
if(phpversion() < 4.2){ 
	foreach($HTTP_SERVER_VARS as $NomVar => $Value) $$NomVar = $Value;
}else{
	foreach($_SERVER as $NomVar => $Value) $$NomVar = $Value;
}
session_start();
$identification = "0";
if($PHP_AUTH_USER != '' && $PHP_AUTH_PW != ''){
	//---------------------------------------LDAP-------------------------------------------
	$serveur1 = new LDAP($PHP_AUTH_USER,$PHP_AUTH_PW,$annu1);
	if($serveur1->connect()){
		if($serveur1->identification()){
			//------------------si identification ok
			header("location: ./index.php");
			//--------------------------------------
		}else{
			//l'utilisateur n'a pas ete reconnu dans sesame
			$identification++;
		}
		$serveur1->deconnect();
	}else{
		//Connexion au serveur de secour
		$serveur2 = new LDAP($PHP_AUTH_USER,$PHP_AUTH_PW,$annu2);
		if($serveur2->connect()){
			if($serveur2->identification()){
				//------------------si identification ok
				header("location: ./index.php");
				//--------------------------------------
			}else{
				//l'utilisateur n'a pas ete reconnu dans sesame
				$identification++;
			}
			$serveur2->deconnect();
		}
	}//---------------------------------------Fin LDAP---------------------------------------
}else{
	//Tout les champ n'ont pas ete renseigner
	$identification++;
}
if($identification != "0"){
	header('WWW-Authenticate: Basic realm="LDAP"');
	echo 'Vous devez entrer un login et un mot de passe valide pour accéder à ces ressources '.$identification;
	//sleep(1);	//on boucle sur un sleep pour faire chier les identification bruteforce.... ;)
	//le mieux searit de pouvoir augmenter ^par puissance n le sleep mais bon.... verrait plus tard
	exit();
}
?>

Conclusion :


Ce code reste très simple et donne les fonctions principale de LDAP que j'ai pu tester n'ayant pas acces a toutes les ressources de ce serveur

pour l'instant
- la connection
- l'identification
- la recherche
- la deconnection

Une fonction de gestion des erreurs devrait bientot suivre quand j'aurai un peu de temps
Tout les echo sont desactiver (en cas d'utilisation de header).

Le code d'exemple permet de se connecter au serveur d'identification et si jamais il est planter on va aller chercher le serveur de secours

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.