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 :

[Securité] Abstract Authentication Listener [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 19
    Par défaut [Securité] Abstract Authentication Listener
    Bonjour à tous !

    Etant depuis pas mal de temps sur la création d'un système d'authentification couplant un Ldap et une base de données, je me heurte à un problème majeur.

    J'ai suivi le tuto disponible sur le site de Symfony (http://symfony.com/doc/current/cookb..._provider.html), et me suis très largement inspiré du FOSFacebookBundle.

    Cependant, mon listener ne semblait pas fonctionner. En effet, il était appellé (echo témoin), mais les erreurs du UsernamePasswordFormAuthenticationListener de Symfony étaient déclenchés.

    J'ai donc voulu changé de méthode en implémentant la classe AbstractAuthenticationListener en lieu et place du AbstractListener.

    Et c'est le drame, si je la défini en tant que classe abstraite, j'ai une fatal erreur car ma variable providerId est nulle.

    Je voulais donc surcharger le constructeur en y injectant mes propres paramètres. Mais impossible de trouver les mots clés de Symfony correspondant !

    Voici ma classe :
    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
     
    <?php
    namespace Sikwan\SikwanSecurityBundle\Security\Firewall;
     
    use Sikwan\SikwanSecurityBundle\Security\Authentication\Token\SikwanUserToken;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\SecurityContextInterface;
    use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
    use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
     
     
    class SikwanListener extends AbstractAuthenticationListener
    {
    	protected $csrfProvider;
     
    	/**
         * {@inheritdoc}
         */
        public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, array $options = array(), AuthenticationSuccessHandlerInterface $successHandler = null, AuthenticationFailureHandlerInterface $failureHandler = null, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, CsrfProviderInterface $csrfProvider = null)
        {
     
            parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, $providerKey, array_merge(array(
                'username_parameter' => '_username',
                'password_parameter' => '_password',
                'csrf_parameter'     => '_csrf_token',
                'intention'          => 'authenticate',
                'post_only'          => true,
            ), $options), $successHandler, $failureHandler, $logger, $dispatcher);
     
            $this->csrfProvider = $csrfProvider;
        }
     
    	protected function attemptAuthentication(Request $request)
        {
        	if ($this->options['post_only'] && 'post' !== strtolower($request->getMethod())) {
                if (null !== $this->logger) {
                    $this->logger->debug(sprintf('Authentication method not supported: %s.', $request->getMethod()));
                }
     
                return null;
            }
     
            if (null !== $this->csrfProvider) {
                $csrfToken = $request->get($this->options['csrf_parameter'], null, true);
     
                if (false === $this->csrfProvider->isCsrfTokenValid($this->options['intention'], $csrfToken)) {
                    throw new InvalidCsrfTokenException('Invalid CSRF token.');
                }
            }
    		$username = trim($request->get($this->options['username_parameter'], null, true));
            $password = $request->get($this->options['password_parameter'], null, true);
     
            $request->getSession()->set(SecurityContextInterface::LAST_USERNAME, $username);
     
            return $this->authenticationManager->authenticate(new UsernamePasswordToken($username, $password, $this->providerKey));
    	}
    }
    (Ma fonction attemptAuthentication est celle de base je ne l'ai pas encore modifiée vu que l'erreur est en amont).

    Et voici ce que j'envoie à mon Container :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        sikwan.security.authentication.listener:
            class: Sikwan\SikwanSecurityBundle\Security\Firewall\SikwanListener
            parent: security.authentication.listener.abstract
            arguments: [@security.context, @security.authentication.manager]
    J'ai donc les deux premiers paramètres de renseignés, mais je ne sais pas comment faire pour les autres.

    Quelqu'un a rencontré ce problème ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Salut,

    Si tu veux injecter des paramètres définis dans ta conf (parameters.ini ou équivalent), il faut utiliser les '%" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sikwan.security.authentication.listener:
            class: Sikwan\SikwanSecurityBundle\Security\Firewall\SikwanListener
            parent: security.authentication.listener.abstract
            arguments: [@security.context, @security.authentication.manager, %ton_param_1%, %ton_param_2%, ...]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 19
    Par défaut
    Bonjour pc.bertineau et merci pour ta réponse.

    Je suis au courant de cela, mais en l'occurence les paramètres demandés par la classe ne sont pas des simples textes mais des classes complètes de Symfony2.

    Le @Security.context permet d'injecter le security context du projet, je me demande si les autres paramètres existent aussi sous cette forme.

    Si les classes devaient juste être initialisées dans le constructeur, je pense qu'elles y seraient.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Je ne vois pas comment faire en dehors d'un '@' pour indiquer un service ou des '%' pour indiquer une chaîne de caractères.

    En l’occurrence, ici, le SecurityContext est un service, défini dans la conf du SecurityBundle de Symfony, ou dans le tien car j'ai l'impression que tu implémentes ton propre SecurityBundle, C'est bien ça ?

    Tu devrais regarder du côté du Service Container et de l'Injection de Dépendances...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 19
    Par défaut
    Je créé effectivement mon propre security bundle. Cependant le security bundle est utilisé par Symfony, je ne l'ai définit nulle part.

    La est bien mon problème, les autres classes demandés sont bien définies par Symfony étant donné que l'authentification fournie utilise cette classe abstraite. Je ne connais juste pas les mots clés pour appeler ces services dans ma conf.

    Je sais me servir du Service Container et de l'Injection de Dépendance, ce n'est pas que je ne sais pas comment configurer mon service c'est juste que la documentation, l'api et le data mining ne me permettent pas à l'heure actuelle de comprendre comment l'utiliser.

    http://api.symfony.com/2.0/Symfony/C...nListener.html

    Ce lien montre la classe que j'utilise, le constructeur demande de nombreuses variables. Je ne dispose que des deux premières. J'ai tenté de les définir moi même mais cela ne fonctionne pas.

    Je suppose donc qu'à la manière du Security.Context, certains de ces classes doivent découler d'un service de Symfony. Mais lequel ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Voilà la conf XML du securityBundle de Symfony, tu as les noms des services qu'il te manque je pense. Il faut juste convertir du XML vers YAML....

    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
     
     
            <service id="security.authentication.listener.abstract" abstract="true" public="false">
                <tag name="monolog.logger" channel="security" />
                <argument type="service" id="security.context" />
                <argument type="service" id="security.authentication.manager" />
                <argument type="service" id="security.authentication.session_strategy" />
                <argument type="service" id="security.http_utils" />
                <argument />
                <argument type="collection"></argument>
                <argument type="service" id="security.authentication.success_handler" on-invalid="null" />
                <argument type="service" id="security.authentication.failure_handler" on-invalid="null" />
                <argument type="service" id="logger" on-invalid="null" />
                <argument type="service" id="event_dispatcher" on-invalid="null" />
            </service>
    Pour info c'est dans ce fichier : vendor/symfony/src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.xml

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

Discussions similaires

  1. [2.x] No authentication listener registered for pattern
    Par boscovicious dans le forum Symfony
    Réponses: 0
    Dernier message: 27/04/2011, 10h31
  2. [Securité] Différence entre Impersonation et Authentication?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 6
    Dernier message: 13/08/2009, 11h32
  3. Key listener is not abstract
    Par LeXo dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/01/2007, 15h50
  4. DoubleClick Listener & ENTER
    Par Pro_Fete dans le forum Composants
    Réponses: 4
    Dernier message: 27/01/2003, 13h23
  5. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50

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