IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plugins PHP Discussion :

sfguard et la validation [sfGuard]


Sujet :

Plugins PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 91
    Par défaut sfguard et la validation
    Bonjour,

    Je suis en train de mettre en place le login via sfGuard, et j'ai trouvé un truc bizarre pour ne pas dire étrange :
    La saisie se fait via le mail et mot de passe, quand je fais un xdebug sur le php "sfGuardValidatorUser" dont voici une portion de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    $allowEmail = sfConfig::get('app_sf_guard_plugin_allow_login_with_email', true);
        $method = $allowEmail ? 'retrieveByUsernameOrEmailAddress' : 'retrieveByUsername';
     
        // don't allow to sign in with an empty username
        if ($username)
        {
           if ($callable = sfConfig::get('app_sf_guard_plugin_retrieve_by_username_callable'))
           {
               $user = call_user_func_array($callable, array($username));
           } else {
               $user = $this->getTable()->retrieveByUsername($username);
           }
            // user exists?
           if($user)
           {
              // password is ok?
              if ($user->getIsActive() && $user->checkPassword($password))
              {
                return array_merge($values, array('user' => $user));
              }
           }
        }
    la variable $method contient bien 'retrieveByUsernameOrEmailAddress' et lorsque j'arrive sur "if ($callable = sfConfig::get...", le programme va tester "retrieveByUsername" et non "retrieveByUsernameOrEmailAddress"
    ce qui veut dire que la validation par mail ne fonctionne pas puisqu'il va faire un select via le pseudo et non via l'email.
    Etrange non?
    Comment l'obliger à faire le test via le mail sans remplacer retrieveByUsername" par "retrieveByUsernameOrEmailAddress" ou ajouter un test sur $methode avec un else, car c'est l'installation par defaut de sfGuard, et en règle générale il est absolument déconseiller de modifier les sources !

    Si vous pouvez m'éclairer
    Merci

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    J'espère que quelqu'un ici connait mieux sfGuard que moi

    Ma réponse ne sera pas des plus encourageante. Je n'ai jamais utilisé que l'authentification par username. Et je n'ai jamais vu passer ici personne qui tente de faire l'un ou l'autre (ou même uniquement par email address).

    Je ne suis pas sur que cela soit possible, même s'il reste dans le code un début de velléité de faire (ou, au contraire, une ouverture pour le future).

    Je dirais que le mieux (mais lourd et beaucoup de conséquence) serait de modifier le plugin pour qu'il colle à tes besoins. Dans le lib local, si tu mets un objet du plugin, il sera pris en priorité par rapport a celui qui est dans plugin.

    Je ne pense pas que ce plugin va beaucoup évoluer dans les années qui viennent, le risque est donc minime, avec la v2, c'est plutôt là que les modifications se porteront.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    C'est une portion du plug-in qui m'a semblé fort obscure et ardue à l'utilisation. Je te conseillerais plus de repartir en effaçant toutes ces horreurs de ta tête et de mettre ta solution à la place de celle de sfGuard à ce niveau.

    D'où cet article : http://www.developpez.net/forums/d99...ation-externe/. Tu peux alors surcharger ce que fait sfGuard au niveau de l'authentification ; même si c'est pour utiliser ce qu'il te propose mais un peu différemment, ça pourrait t'être utile.

    La section où ce même code est montré et (un peu) décortiqué (pour les besoins de la suite, sans plus) : http://tcuvelier.developpez.com/php/...-externe/#LIII.

    Ça sera probablement sortir l'arme nucléaire pour tuer la mouchette, mais, si ça fonctionne pour toi, c'est déjà ça de pris ! Au pire, modifie les sources du plug-in, si ça t'évite de faire un détour de quelques dizaines de ligne qui pourrait potentiellement mettre tout à terre (enfin, il m'a fallu bien chipoter pour arriver au résultat que je voulais).

    la variable $method contient bien retrieveByUsernameOrEmailAddress' et lorsque j'arrive sur "if ($callable = sfConfig::get...", le programme va tester "retrieveByUsername" et non "retrieveByUsernameOrEmailAddress"
    C'est malheureusement normal, la variable $method est déclarée, bien remplie... et abandonnée lâchement dans la nature, sans qu'on tente de la lire. Pour corriger ça, je propose de remplacer le premier bout de code par le second (à tester, évidemment, je ne l'ai pas fait).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           } else {
               $user = $this->getTable()->retrieveByUsername($username);
           }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    } elseif($method == 'retrieveByUsernameOrEmailAddress') {
        if(!($user = $this->getTable()->retrieveByUsername($username)))
            $user = $this->getTable()->retrieveByEmailAddress($username);
        } else {
               $user = $this->getTable()->retrieveByUsername($username);
           }
    Pas sûr du nom de la méthode.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 91
    Par défaut
    Problème résolu

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Mettre la solution apportera certainement une aide à ceux qui pourraient arriver ici avec la même question, lire ce sujet, et, pour l'instant, repartir frustrés heu non, pas cool

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 91
    Par défaut
    Voilà la solution sans toucher aux sources originaux:
    Dans le fichier myUser.class.php, ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public static function checkUserByEmail($username)
        {
            return Doctrine::getTable('sfGuardUser')->retrieveByUsernameOrEmailAddress($username);
        }
    Et dans l'app.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      .sf_guard_plugin:
        sf_guard_plugin_retrieve_by_username_callable: [myUser,checkUserByEmail]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. test et validation de votre programme!!!
    Par l'indien dans le forum C
    Réponses: 8
    Dernier message: 25/06/2003, 15h43
  2. validation d'un XML schema
    Par nicolas_jf dans le forum Valider
    Réponses: 2
    Dernier message: 05/05/2003, 11h25
  3. est ce un XSchema Valide?
    Par Slash dans le forum Valider
    Réponses: 4
    Dernier message: 06/03/2003, 14h01
  4. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54
  5. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo