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

Symfony PHP Discussion :

Permettre une authentification grâce à un UserProvider custom [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Permettre une authentification grâce à un UserProvider custom
    Bonjour à tous !

    J'ai vu plusieurs sujets qui traitent de ma question sur le net (et dans la doc') mais pourtant je n'arrive pas à le faire fonctionner et je ne comprends pas pourquoi.

    Donc pour clarifier les choses, je souhaite créer mon propre user provider afin d'aller récupérer les membres via des requêtes SQL (je ne veux pas utiliser doctrine). Ainsi j'ai suivi la doc' et les conseils de plusieurs topics/articles, ce qui donne le code ci-dessous.

    Le problème étant que je n'arrive pas à me connecter malgré tout. Lorsque j'essaie de me connecter avec les "comptes" inscrits en dur dans le security.yml (user/userpass par exemple), ça fonctionne. Mais lorsque j'essaie de passer par mon propre provider en mettant d'autres identifiants, il ne les reconnait pas me sort un simple "Bad credentials" comme erreur (ce n'est pas une erreur de symfony, juste une erreur retournée lorsque aucun utilisateur n'a été trouvé dans les providers).

    Pour rendre les choses plus simples, je ne fais aucune requête dans mon provider, je renvois juste un membre fictif mon simuler une connexion réussie. Comme ça ne fonctionne pas, il me semble que symfony n'essaie même pas de passer par mon provider pour l'authentification, mais pourquoi...?

    Merci par avance pour votre aide ! Je vous donne mon code ci-dessous.


    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    # app/config/security.yml
     
    security:
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                memory:
                    users:
                        user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
            webservice:
                id: webservice_user_provider
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            login:
                pattern:  ^/login$
                security: false
     
            secured_area:
                pattern:    ^/
                form_login:
                    check_path: _security_check
                    login_path: _login
                    always_use_default_target_path: true
                    default_target_path: subject_homepage
                logout:
                    path:   _logout
                    target: subject_homepage
                anonymous: ~
     
        access_control:
            - { path: ^/admin/, roles: ROLE_ADMIN }
            # - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
     
    imports:
        - { resource: parameters.yml }
        - { resource: security.yml }
        - { resource: @SubjestWebserviceUserBundle/Resources/config/services.yml }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # src/Subjest/WebserviceUserBundle/Resources/config/services.yml
     
    parameters:
        webservice_user_provider.class: Subjest\WebserviceUserBundle\Security\User\WebserviceUserProvider
     
    services:
        webservice_user_provider:
            class: "%webservice_user_provider.class%"

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    // src/Subjest/WebserviceUserBundle/Security/User/WebserviceUserProvider.php
     
    namespace Subjest\WebserviceUserBundle\Security\User;
     
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
    use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
     
    class WebserviceUserProvider implements UserProviderInterface
    {
        public function loadUserByUsername($username)
        {
    		// Pour simplifier les choses, je renvoie un utilisateur directement
    		return new WebserviceUser('toto', 'pass', NULL, array('ROLE_AUTHENTICATED'));
     
        }
     
        public function refreshUser(UserInterface $user)
        {
            if (!$user instanceof WebserviceUser) {
                throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
            }
     
            return $this->loadUserByUsername($user->getUsername());
        }
     
        public function supportsClass($class)
        {
            return $class === 'Subjest\WebserviceUserBundle\Security\User\WebserviceUser';
        }
    }


    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php
    // src/Subjest/WebserviceUserBundle/Security/User/WebserviceUser.php
     
    namespace Subjest\WebserviceUserBundle\Security\User;
     
    use Symfony\Component\Security\Core\User\UserInterface;
     
    class WebserviceUser implements UserInterface
    {
        private $username;
        private $password;
        private $salt;
        private $roles;
     
        public function __construct($username, $password, $salt, array $roles)
        {
            $this->username = $username;
            $this->password = $password;
            $this->salt = $salt;
            $this->roles = $roles;
        }
     
        public function getRoles()
        {
            return $this->roles;
        }
     
        public function getPassword()
        {
            return $this->password;
        }
     
        public function getSalt()
        {
            return $this->salt;
        }
     
        public function getUsername()
        {
            return $this->username;
        }
     
        public function eraseCredentials()
        {
        }
     
        public function equals(UserInterface $user)
        {
            if (!$user instanceof WebserviceUser) {
                return false;
            }
     
            if ($this->password !== $user->getPassword()) {
                return false;
            }
     
            if ($this->getSalt() !== $user->getSalt()) {
                return false;
            }
     
            if ($this->username !== $user->getUsername()) {
                return false;
            }
     
            return true;
        }
    }

    Encore une fois merci par avance !

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 829
    Points
    829
    Par défaut
    Salut,
    As-tu essayé en retirant de ton security.yml le provider "in_memory".
    Dans le cas contraire, il manque la précision de l'ordre des providers (cf book http://symfony.com/fr/doc/current/bo...d-utilisateurs ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # app/config/security.yml
    security:
        providers:
            chain_provider:
                chain :
                    providers: [in_memory, user_db]
            in_memory:
                memory:
                    users:
                        foo: { password: test }
            user_db:
                entity: { class: Acme\UserBundle\Entity\User, property: username }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci pour cette réponse fatbob !

    J'avais effectivement essayé de retirer le provider in_memory mais sans succès. Je viens de réessayer au cas où mais ça ne fonctionne pas.
    Je connaissais pas le deuxième point que tu soulignes sur l'ordre des providers, merci pour l'info !
    Je viens de le rajouter en faisant la modification du nom du provider mais toujours aucun résultat malheureusement.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonsoir, je suis reparti de zéro (avec un nouveau dossier "symfony") pour essayer de réutiliser le provider et cette fois-ci ça fonctionne à merveille. Je comprends pas du tout la différence entre les deux projets, ça doit être une toute petite bêtise bête qui s'est glissé dans un fichier perdu.
    Désolé du dérangement et merci encore fatbob, ton lien m'a quand même bien aidé pour le coup !

  5. #5
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 829
    Points
    829
    Par défaut
    Un dernier complément...
    Peut-être l'as-tu déjà vu mais j'ai mis ici à peu près tout ce que je sais dans ce domaine :
    http://www.developpez.net/forums/d12...ion+compl%E8te

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/08/2006, 14h23
  2. [WebForms]Comment modifier la force d'une authentification ?
    Par igorzup dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 29/05/2006, 17h16
  3. Réponses: 1
    Dernier message: 28/04/2006, 16h55
  4. [J2EE] Distribuer une authentification
    Par SEMPERE Benjamin dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 03/10/2005, 15h55

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