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 :

[Authentication] Provider personnalisé et formulaires [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 417
    Points : 826
    Points
    826
    Par défaut [Authentication] Provider personnalisé et formulaires
    Bonjour,
    Je suis en train d'essayer de me faire un Bundle de sécurité (comme d'autres apparemment :-) ).
    J'ai réussi à mettre en route un système personnalisé (en suivant le cookbook) avec :
    Un User
    Un UserProvider
    Un Token
    Un Listener
    Un AuthenticationProvider
    et la Factory pour lier le tout.

    Pour l'instant, le système est très basique et ne fait appel à aucun service particulier (c'est juste un squelette).

    Mon problème, c'est que quand je fais tout ça, je ne passe plus par le formulaire de login.
    Et si je paramètre security.yml pour avoir accès à l'écran de login, je désactive le service de la factory que j'ai créée et donc je ne passe plus par mon authenticationProvider ni mon Token.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        providers:
            accessmaster_service:
                id: accessmaster_user_provider
            #...
            secured_area:
                pattern:    ^/
                provider: accessmaster_service
                accessmaster: true
                provider: accessmaster_service
                form_login:
                    login_path: /login
                    check_path: /login_check
    Si la ligne 'accessmaster: true' est là, form_login ne sert à rien, tout passe par les classes que j'ai récupérées dans le cookbook
    Si elle n'est pas là, j'ai bien le form login mais je n'arrive plus à utiliser mon AuthenticationProvider.
    Le user provider est toujours utilisé grâce à la ligne "provider: accessmaster_service"

    Quelqu'un saurait-il me dire où je peux faire en sorte :
    - soit de créer une form_login personnalisée dans le circuit tiré du cookbook
    - soit que le form_login normal utilise mon authenticationProvider (cela revient-il à redéfinir le login_check ? Et si oui, comment puis-je procéder ?

    Ayant plusieurs versions de code, je ne le poste pas ici, d'autant que les différents trajets fonctionnent et que je ne m'attends pas nécessairement à une correction de code mais plutôt à des pistes de réflexion.
    Cependant, si vous souhaitez voir mes errements, n'hésitez pas à demander les parties que vous souhaitez voir... Toutes au besoin.

    Toute suggestion sera appréciée,
    Merci.

  2. #2
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Essaye de remplacer :
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    accessmaster:
        login_path: /login
        check_path: /login_check

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 417
    Points : 826
    Points
    826
    Par défaut
    Merci pour la piste.
    En premier test, cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InvalidConfigurationException: Unrecognized options "login_path, check_path" under "security.firewalls.secured_area.accessmaster"
    J'imagine que cela se passe au niveau de la factory puisque c'est là qu'on définit la clé "accessmaster"...
    Et que ces arguments doivent être passés en configurant le security factories.
    Mais là, je n'ai pas trop idée de comment on fait pour déclarer ces arguments...
    J'ai listé les services avec "php app/console container:debug" mais je n'ai rien vu qui me semble correspondre.

    Voilà donc le code de ma factory
    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
     
    <?php
    // src/Acme/SecurityBundle/DependencyInjection/Security/Factory/AccessMasterFactory.php
     
    namespace Acme\SecurityBundle\DependencyInjection\Security\Factory;
     
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Reference;
    use Symfony\Component\DependencyInjection\DefinitionDecorator;
    use Symfony\Component\Config\Definition\Builder\NodeDefinition;
    use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface;
     
    class AccessMasterFactory implements SecurityFactoryInterface
    {
        public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
        {
            $providerId = 'security.authentication.provider.accessmaster.'.$id;
            $container->setDefinition($providerId, new DefinitionDecorator('accessmaster.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProvider));
     
            $listenerId = 'security.firewall.listener.accessmaster.'.$id;
            $listener = $container->setDefinition($listenerId, new
                DefinitionDecorator('accessmaster.security.firewall.listener'));
            return array($providerId, $listenerId, $defaultEntryPoint);
        }
    et de mon security_factories.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # /src/Acme/SecurityBundle/Resources/config/security_factories.yml
    services:
        security.authentication.factory.accessmaster:
            class: Acme\SecurityBundle\DependencyInjection\Security\Factory\AccessMasterFactory
            tags:
                - { name: security.listener.factory }
    ##############
    En fouillant sur les forums, je suis bien tombé sur un sujet (http://stackoverflow.com/questions/1...der-form-login) qui semblerait correspondre à mon problème.
    La personne définit sa Factory en héritant de FormLoginFactory.

    De même, son listener est dérivé de "AbstractAuthenticationListener" alors que le mien implémente "ListenerInterface"

    Malheureusement, le code qu'il a posté ne précise pas les "use" et surtout pas les fichiers de configuration si bien que lorsque j'ai essayé de mettre ça en place, je suis resté bloqué sur la déclaration des arguments qui sont différents et plus nombreux que dans les cas présentés dans le cookbook.

  4. #4
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    As tu bien ajouté la ligne suivante dans ton security.yml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        factories:
            AcmeFactory: "%kernel.root_dir%/../src/Acme/SecurityBundle/Resources/config/security_factories.yml"

  5. #5
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 417
    Points : 826
    Points
    826
    Par défaut
    Elle diffère un peu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        factories:
            - "%kernel.root_dir%/../src/Acme/SecurityBundle/Resources/config/security_factories.yml"

  6. #6
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 417
    Points : 826
    Points
    826
    Par défaut
    En utilisant ta syntaxe, le résultat est identique.

  7. #7
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Ah je viens de voir ta factory est une implémentation de l'interface "SecurityFactoryInterface"

    Alors que la mienne est étendue de "FormLoginFactory". C'est sans doute pour cela qu'elle gère form_login.

    Je te met le code de ma factory au cas ou ça puisse t'aider.

    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
     
    namespace SocleCommun\AuthentificationBundle\Security\Factory;
     
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Reference;
    use Symfony\Component\DependencyInjection\DefinitionDecorator;
     
    use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\FormLoginFactory;
     
    class AuthenticationFactory extends FormLoginFactory{
     
        public function __construct(){
            parent::__construct();
        }
     
        public function getKey(){
            return 'auth';
        }
     
        protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId){
            $provider = 'security.authentication.provider.auth.'.$id;
            $container
                ->setDefinition($provider, new DefinitionDecorator('auth.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProviderId))
                ->replaceArgument(2, $id)
            ;
     
            return $provider;
        }
    }
    Je ne déclare pas de listener car j'utilise celui de base de symfony.

  8. #8
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 417
    Points : 826
    Points
    826
    Par défaut
    Ca a l'air de commencer à fonctionner...
    Merci (beaucoup)

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

Discussions similaires

  1. membership provider personnalisé
    Par hounsasos dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 15/04/2011, 10h29
  2. [Security] Plusieurs authentication provider
    Par anas4120 dans le forum Spring
    Réponses: 0
    Dernier message: 17/05/2010, 14h33
  3. [Security] Authentication Provider jamais appelé
    Par Tino13 dans le forum Spring
    Réponses: 1
    Dernier message: 14/05/2010, 20h57
  4. Authentication Provider et Identity Assertion
    Par yolepro dans le forum Weblogic
    Réponses: 1
    Dernier message: 10/06/2008, 09h14

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