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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 993 fois - Téléchargée 36 fois

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

Ajouter un commentaire

Commentaires

Messages postés
15
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
15 mars 2007

rebonjour EHMARC c'est la petite ennyeuse qui revient car j'ai tjrs ce probléme de connexion car apres ma fenêtre d'authentification je n'ai rien et apres avoir remplis le login et le pass je dois cliquez sur le bouton OK 3 fois et apres cela ma page apres authentification ne se lanse pas c'est une page blanche qui se lance ceci prouve que je ne me logggue pas sur l'annuaire et je ne vois pas où est le probléme car avec phpldapadmin j'arrive à me connecté mais seulement je dois mettre comme login la baseDN de l'utilisateur qui ve se logger je ne sais pas si tu tiens compte de cela ou c'est ça le probléme en tout cas voilà ce que j'ai fais du code STP REGARDE UN PEU ET DIS MOI QUOI et encore merci pour tout

<?php
//code1
$annu1 = "didie"; //Annuaire Principal il faut remplir avec le nom de ton serveur ou l'adresse ip si c'est pas défini
include "./toto.php";
header('WWW-Authenticate: Basic realm="LDAP"'); //fenetre de login ca sort tout seul une jolie fenetre

/*j'ai oublié ca sans quoi ca ne te ramene pas les variables*/
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()){ //connexion au serveur LDAP
if($serveur1->identification()){ //identification au serveur LDAP
//------------------si identification ok
header("location: ./inde.php"); //page suivante de ta page d'authentification
/*le code doit etre situé en debut de page si tu utilise le header sinon ca va planter
si tu ne veut pas utiliser le header il y a moyen en fait tu met ici tout le code a executer si l'authentification est bonne*/
}else{
//l'utilisateur n'a pas ete reconnu dans l'annuaire LDAP
}
$serveur1->deconnect(); //on se deconnect du serveur c'est plus propre quand meme
}else{
//connexion impossible
}
}else{
//il faut remplir les champ
}
?>


<?php
//code2+ajout du formulaire
$annu1 = "didie"; //Annuaire Principal il faut remplir avec le nom de ton serveur ou l'adresse ip si c'est pas défini
include "./toto.php";

//header('WWW-Authenticate: Basic realm="LDAP"'); //fenetre de login ca sort tout seul une jolie fenetre
/*j'ai oublié ca sans quoi ca ne te ramene pas les variables*/
if(phpversion() < 4.2){
foreach($HTTP_SERVER_VARS as $NomVar => $Value) $$NomVar = $Value;
}else{
foreach($_SERVER as $NomVar => $Value) $$NomVar = $Value;
}
if($PHP_AUTH_USER != '' && $PHP_AUTH_PW != ''){
//---------------------------------------LDAP-------------------------------------------
$serveur1 = new LDAP($PHP_AUTH_USER,$PHP_AUTH_PW,$annu1);
if($serveur1->connect()){ //connexion au serveur LDAP
if($serveur1->identification()){ //identification au serveur LDAP
//------------------si identification ok
header("location: ./inde.php"); //page suivante de ta page d'authentification
/*le code doit etre situé en debut de page si tu utilise le header sinon ca va planter
si tu ne veut pas utiliser le header il y a moyen en fait tu met ici tout le code a executer si l'authentification est bonne*/
}else{
//l'utilisateur n'a pas ete reconnu dans l'annuaire LDAP
}
$serveur1->deconnect(); //on se deconnect du serveur c'est plus propre quand meme
}else{
//connexion impossible
}
}else{
//il faut remplir les champ
}
?>
<html>
<head>
<title>Authentification</title>
</head>




<script language="Javascript">

function verifierSaisie() {
if(document.authentification.$PHP_AUTH_USER.value=="") {
alert("Login non saisi.");
}
else {
if(document.authentification.$PHP_AUTH_PW.value=="") {
alert("Pass non saisi");
}
else {
document.authentification.cours.value="en cours...";
document.authentification.submit();
}
}
}


</script>




<form name="authentification" action="<? $PHP_SELF ?>" method="post">
Authentification,

----

Login :,
,

----

Pass :,
,

----



</form>




</html>
Messages postés
393
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
29 septembre 2008

J'avais oublié un chapitre dans le code lol
<?php
$annu1 = "TonServeur"; //Annuaire Principal il faut remplir avec le nom de ton serveur ou l'adresse ip si c'est pas défini
include "./toto.php";
header('WWW-Authenticate: Basic realm="LDAP"'); //fenetre de login ca sort tout seul une jolie fenetre
/*j'ai oublié ca sans quoi ca ne te ramene pas les variables*/
if(phpversion() < 4.2){
foreach($HTTP_SERVER_VARS as $NomVar => $Value) $$NomVar = $Value;
}else{
foreach($_SERVER as $NomVar => $Value) $$NomVar = $Value;
}
if($PHP_AUTH_USER != '' && $PHP_AUTH_PW != ''){
//---------------------------------------LDAP-------------------------------------------
$serveur1 = new LDAP($PHP_AUTH_USER,$PHP_AUTH_PW,$annu1);
if($serveur1->connect()){ //connexion au serveur LDAP
if($serveur1->identification()){ //identification au serveur LDAP
//------------------si identification ok
header("location: ./index.php"); //page suivante de ta page d'authentification
/*le code doit etre situé en debut de page si tu utilise le header sinon ca va planter
si tu ne veut pas utiliser le header il y a moyen en fait tu met ici tout le code a executer si l'authentification est bonne*/
}else{
//l'utilisateur n'a pas ete reconnu dans l'annuaire LDAP
}
$serveur1->deconnect(); //on se deconnect du serveur c'est plus propre quand meme
}else{
//connexion impossible
}
}else{
//il faut remplir les champ
}
?>

Tu peut remplacer cette ligne de header par ton formulaire ya pas de soucis (faut juste apres que tu remplace $PHP_AUTH_USER,$PHP_AUTH_PW par tes variables sinon ca va pas marcher)

de plus si tu met du HTML à la place du header d'authentification il faut que tu change le second header("location ./index.php") par un code php genre un
echo("ouais j'ai gagné");


Sinon pour ton dexieme message c'est une histoire de securité pour eviter qu'on te pirate il y a plein de methode genre les session ...
Moi je passai un code a ma deuxieme page (avec un hash MD5) j'enregistrai ce hash et l'IP le nom de user la date et l'heure dans une table (ainsi que la derniere page visitée) le tout en passant mes variables par une session
Messages postés
15
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
15 mars 2007

EHMARC le service où je suis en stage est entrain de fermer dc je continuerai demain je ne pourrai rien testé à la maison merci de regarder ses qq remarque c'est gentil
Messages postés
15
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
15 mars 2007

"je te conseille tout de meme dans ce cas de creer une session ou de passer un parametres qui permet de verifier que le mec c'est bien loguer et n'as pas appeler cette page directement" dans ton code on ne travail qu'avec l'appel des fonctions comment puis je faire cette partie car je suis entrain de testé ma page et je ne sais même pas dire si je suis connecté ou pas merci de m'aider je commençais à desespérer
Messages postés
15
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
15 mars 2007

header('WWW-Authenticate: Basic realm="LDAP"')est ce que je peux remplacer cette ligne par un formulaire que je ferai moi même ou cela causera un probléme et en plus qd il me demande l'authentification qd je met le login et le pass et qd j'appuie sur ok il laisse le champs login vide et ne fais rien la fenêtre d'authentification est tjrs là et je dois rentrer le pass plusieur fois pour enfin avoir une fenêtre blanche je demande à remplacer cette ligne par un formulaire pour pouvoir renvoyer les message d'erreur coe koi login ou pass éronné ou alors veuillé saisir votre login ou pass
Afficher les 11 commentaires

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.