Page 1 sur 2

[Symfony] LDAP et sfGuardPlugin

Posté : 04 juil. 2008, 15:51
par Julien33
Bonjour,

Je suis tout nouveau ici, car ça fait des heures qu'au boulot je cherche une solution.
En effet je travaille sur un nouveau projet symfony, et j'ai besoin de l'authentification sur un serveur LDAP.
Pour cela, j'ai décidé d'utiliser le plugin sfGuard pour symfony.
La arrive le probleme, la doc sur l'authentification par un ldap est pas claire et tres légère. Du coup je galere vraiment.
Ce que j'ai fait :
une classe myLDAP.class.php dans mon dossier monprojet/monappli/lib
class myLDAP extends sfGuardSecurityUser
{

   public static function checkLDAPPassword($username, $password) {
   
return true; // de toute façon le code n'arrive pas la

}
}
et dans le app.yml :

Code : Tout sélectionner

# default values all: sf_guard_plugin: check_password_callable: [MyLDAP, checkLDAPPassword]
ce qui est bien pris en compte. Le probleme semble etre qu'il ne trouve pas ma fonction dans la classe, mais pourquoi, je ne sais pas, et vraiment je commence à perdre patience.
J'obtient l'erreur

Code : Tout sélectionner

Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'MyLDAP::checkLDAPPassword' was given in /monprojetsymfony/plugins/sfGuardPlugin/lib/model/plugin/PluginsfGuardUser.php on line 66
sans pouvoir m'en débarasser.
En regardant la ligne qui pose probleme, je découvre :
  return call_user_func_array($callable, array($this->getUsername(), $password, $this));
j'ai fait un var_dump($callable); qui me donne un :

Code : Tout sélectionner

array 0 => string 'MyLDAP' (length=6) 1 => string 'checkLDAPPassword' (length=17)
ce qui est logique.
Merci d'avance pour l'aide

Posté : 04 juil. 2008, 16:10
par zeus
Est-ce que tu as fait un clear-cache depuis que tu as ajouté ta nouvelle classe, de manière à ce que l'autoload soit rafraichi ?

Posté : 04 juil. 2008, 16:12
par Julien33
Oui :cry:

Posté : 04 juil. 2008, 16:28
par zeus
Est-ce que tu as essayé un simple
MyLDAP::checkLDAPPassword('truc', 'muche');
Dans une action ?

Posté : 04 juil. 2008, 16:36
par Julien33
Je mettrais ça ou en somme ? dans l'action correspondant à sfGuard ?
En fait je ne peux pas me logger, donc je ne peux pas acceder aux modules, à part default.
Non ?
De plus je viens de noter que ce que j'obtiens, présenté au dessus n'est valable que lorsque le username est admin. sans quoi j'ai juste marqué "The username and/or password is invalid." et sans passer par ma classe et fonction, j'ai vérifié avec un echo dans la fonction.

Merci beaucoup pour les réponses.

Posté : 04 juil. 2008, 16:47
par zeus
En fait, je me demande si ta classe est correctement chargée par l'autoload :-k

du coup, si tu pouvais désactiver la sécurité sur une action et mettre le code que je t'ai donné, ça permettrais de vérifier mon intuition ;)

Posté : 04 juil. 2008, 16:53
par Julien33
Je pense que tu as raison, j'ai désactivé la sécurité de l'appli frontend, et mis le code que tu m'as donné dans l'action du module main et en allant sur http://monappli/frontend_dev.php/main j'obtient :

Fatal error: Class 'MyLDAP' not found in /home/monprojetsymfony/apps/frontend/modules/main/actions/actions.class.php on line 19

Comment résoudre alors du coup ?

Edit, en allant sur http://monappli/frontend_dev.php j'obtient toujours l'erreur du callback.
De plus celle ci est toujours uniquement valable pour le usename admin. cela aurait il un lien avec le fichier contenu dans data/fixtures ensuite chargé ?

Posté : 04 juil. 2008, 17:02
par zeus
Pour le 1er point, est-ce que tu peux nous dire où se trouve exactement ta classe ?

Pour le second point, j'avoue que je ne sais pas quoi te répondre, ne connaissant pas très bien sfGuardPlugin et voyant ton code. :?

Posté : 04 juil. 2008, 17:06
par Julien33
ma classe monLDAP.class.php est dans /racineduprojet/apps/frontend/lib, a coté de myUser.class.php.

Encore une fois merci de prendre ton temps à me répondre.

Posté : 04 juil. 2008, 17:19
par zeus
alors là ... je ne sais franchement pas ce qui peut se passer :shock:

La dernière piste qui me viens en tête, c'est de faire en sorte que le nom de ton fichier "colle" bien au nom de ta classe :?
class MyLDAP => myLDAP.class.php

Posté : 04 juil. 2008, 17:22
par Julien33
Oui pardon, ma classe s'apelle bien MyLDAP.class.php
C'est un casse tete, je ne comprends pas non plus ce qui fait que ça ne marche pas...

EDIT :
J'ai mis mon projet sur megaupload; si quelqu'un veut y jetter un oeil.

D'avance merci. : :wink:

Posté : 04 juil. 2008, 18:57
par pascaltje
ça serait pas un pb de casse ?

j'ai déjà eu un truc dans le genre, avec un nom de classe comportant des majuscules - ou pas.

je ferais un truc, genre :
_ dans la définition de la classe : class myLDAP
_ nom de fichier : myLDAP.class.php
_ dans app.yml : check_password_callable: [myLDAP, checkLDAPPassword]

hope this helps

A+

Pascal

Posté : 07 juil. 2008, 09:48
par Julien33
Merci de la réponse.
Concernant la casse, tu peux voir le code, c'est comme ça que j'ai fait. :wink:

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
edit : oups, erreur de session, c'est bien moi qui ait posté
:D

EDIT 2 : En effet, c'était ça en fait. MyLDAP vs myLDAP... bien joué, vendredi soir j'avais pas été capable de comprendre ce que zeus m'avait proposé... :?

Posté : 07 juil. 2008, 16:02
par Julien33
Je reviens poster car je me suis un peu emballé tout à l'heure en indiquant résolu.
En effet si le premier probleme évoqué (myLDAP.class.php) est bien résolu, le fait que si je n'entre pas admin en tant qu'uid, il ne va pas dans ma classe est toujours d'actualité.
Auriez vous une solution ? Pardon de refermer, puis réouvrir...

Posté : 08 juil. 2008, 14:55
par Julien33
J'ai trouvé.
Je donne la solution si d'autres cherchent et tombent dessus...
Il faut donc créer dans la bd (table user créée automatiquement par sfGuard) des utilisateurs avec un username égal au uid du ldap, meme si ensuite le mot de passe sera vérifié dans le LDAP.