[Symfony] LDAP et sfGuardPlugin

Petit nouveau ! | 9 Messages

04 juil. 2008, 15:51

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
Modifié en dernier par Julien33 le 07 juil. 2008, 10:02, modifié 3 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 juil. 2008, 16:10

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 ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

04 juil. 2008, 16:12

Oui :cry:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 juil. 2008, 16:28

Est-ce que tu as essayé un simple
MyLDAP::checkLDAPPassword('truc', 'muche');
Dans une action ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

04 juil. 2008, 16:36

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 juil. 2008, 16:47

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

04 juil. 2008, 16:53

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é ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 juil. 2008, 17:02

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. :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

04 juil. 2008, 17:06

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 juil. 2008, 17:19

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

04 juil. 2008, 17:22

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:
Modifié en dernier par Julien33 le 07 juil. 2008, 10:51, modifié 1 fois.

ViPHP
ViPHP | 1024 Messages

04 juil. 2008, 18:57

ç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

Petit nouveau ! | 9 Messages

07 juil. 2008, 09:48

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é... :?

Petit nouveau ! | 9 Messages

07 juil. 2008, 16:02

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...

Petit nouveau ! | 9 Messages

08 juil. 2008, 14:55

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.