problème d'authentification ldap (sf1.4 + sfguard + ldap)

65 views
Skip to first unread message

eddie

unread,
Dec 28, 2009, 10:07:53 AM12/28/09
to Symfony-fr
Bonjour,

Je suis en train de démarrer un projet avec symfony 1.4 j'ai installé
le plugin sfguard.
Le plugin sfguard est visiblement bien installé car les tables sont
générées dans la base de données et j'ai bien le formulaire de
connexion (je n'ai pas chargé les fixtures).
Maintenant je souhaite faire l'authentification via l'annuaire LDAP et
c'est là que je suis bloqué, je pense avoir fait le tour sur google à
ce sujet.

J'ai suivi les instructions marquées sur la documentation du plugin :
http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin

dans "/apps/main/config/app.yml" j'ai le code suivant :

all:
sf_guard_plugin:
check_password_callable: [myLDAP, checkLDAPPassword]

dans "/apps/main/lib/myLDAP.class.php" :

class myLDAP extends sfGuardSecurityUser
{
public static function checkLDAPPassword($username, $password)
{
$user = LDAP::getUser($username);
if ($user->checkPassword($password))
{
return true;
}
else
{
return false;
}
return true;
}
}

Pour le moment la fonction checkLDAPPassword est celle proposé dans la
documentation de sfguard mais d'après ce que j'ai compris sur d'autre
site il faut utiliser une classe pour établir la liaison avec
l'annuaire.
J'ai repéré 2 classes "adLDAP" et "Zend_ldap", j'aurai une préférence
pour Zend_ldap car je pense que pour ce projet j'aurai besoin d'autres
librairies de Zend.
Donc je ne sais pas trop comment modifier ma fonction
checkLDAPPassword pour la faire fonctionner avec Zend_ldap.

J'ai ajouté l'ensemble des librairies de Zend dans "/lib/vendor/Zend/"
puis j'ai modifié le fichier "/config/ProjectConfiguration.class.php"
pour activer Zend (code récupéré dans un pdf) :

class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
$this->enablePlugins(array(
'sfDoctrinePlugin',
'sfDoctrineGuardPlugin',
));

// Chargement des librairies Zend
set_include_path(sfConfig::get('sf_lib_dir').'/
vendor'.PATH_SEPARATOR.get_include_path());
require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/
Autoloader.php';
Zend_Loader_Autoloader::getInstance();
}
}

D'après quelques tests j'ai l'impression que la fonction
checkLDAPPassword n'est pas utilisé car avec le code suivant je ne
suis pas connecté :

public static function checkLDAPPassword($username, $password)
{
return true;
}

Merci d'avance de partager votre expérience sur le sujet !
++

eddie

unread,
Dec 29, 2009, 3:52:44 AM12/29/09
to Symfony-fr
Re,

Bon j'ai du neuf. Je viens de charger des fixtures pour le plugin
sfguard et quand je me connecte avec un user qui existe dans la table
sf_guard_user j'obtiens l'erreur suivante :

Warning: call_user_func_array() [function.call-user-func-array]: First
argument is expected to be a valid callback,
'myLDAP::checkLDAPPassword' was given in ..\monprojet\plugins
\sfDoctrineGuardPlugin\lib\model\doctrine\PluginsfGuardUser.class.php
on line 79

C'est quand même bizarre que l'utilisateur doit exister dans la base
de données pour lancer la fonction checkLDAPPassword non ?

Par contre même avec la fonction suivante j'obtiens la même erreur :

public static function checkLDAPPassword($username, $password)
{
return true;
}

++

eddie

unread,
Dec 29, 2009, 5:22:15 AM12/29/09
to Symfony-fr
Après le test suivant :

j'ai désactivé la sécurité sur le fichier "/main/config/
security.yml" :

default:
is_secure: false

j'ai créé un module home chargé par défaut via le routing et dans
l'action j'ai le code suivant :

class homeActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
myLDAP::checkLDAPPassword('test', 'test');
}
}

j'obtiens l'erreur suivante :

Fatal error: Class 'myLDAP' not found in ..\monprojet\apps\main\modules
\home\actions\actions.class.php

visiblement la classe myLDAP n'est pas chargé pourtant tout est nommé
correctement il me semble.
Les classes ne sont elles pas chargées automatiquement ?

/monprojet/apps/main/lib/myLDAP.class.php (class myLDAP extends
sfGuardSecurityUser)

++

eddie

unread,
Dec 29, 2009, 6:38:46 AM12/29/09
to Symfony-fr
Bon j'ai trouvé pourquoi ma classe n'était pas chargé (je suis tombé
dessus par hasard)
je suis sous un environnement windows, j'utilise notepad++ comme
éditeur.
en éditant le fichier "myLDAP.class.php" j'ai remarqué en bas à droite
de notepad++ à gauche du format ansi pour ce fichier il y avait marqué
Macintosh alors que tous les autres fichiers (le peux que j'ai ouvert)
sont marqués Dos\Windows !
J'ai créé un nouveau fichier avec le même nom en faisant du copier/
coller à présent il y a marqué Dos/Windows et sa fonctionne comme quoi
^^

Bon maintenant il me reste plus qu'a créer la fonction
checkLDAPPassword que je ne manquerai pas de coller ici à moins que
quelqu'un me devance.
Pour info j'ai lu sur un forum qu'il faut aussi avoir les users dans
la bdd mais la vérification du mot de passe est effectué sur
l'annuaire ldap.

eddie

unread,
Jan 5, 2010, 8:10:26 AM1/5/10
to Symfony-fr
Me voilà de retour avec mon problème d'authentification.
Finalement j'ai abandonné l'idée d'utiliser zend_ldap pour utiliser
une fonction beaucoup plus légère.
Je vous partage le code (qui fonctionne sa peut-être bien de préciser)
en espérant que sa puisse servir à quelqu'un.

class myLDAP extends sfGuardSecurityUser
{
public static function checkLDAPPassword($username, $password)
{

$host = "ldap://intra.domaine.net";
$username = $username."@intra.domaine.net";
$ldapconn = ldap_connect($host);
if ($ldapconn)
{
$ldapbind = @ldap_bind($ldapconn, $username, $password);
if ($ldapbind)
{
ldap_unbind($ldapconn);


return true;
}
else
{
return false;
}
}

else
{
return false;
}
}
}

Bonne année 2010 ++

Reply all
Reply to author
Forward
0 new messages