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 !
++
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;
}
++
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)
++
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.
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 ++