Rediriger si l'utilisateur est connecté

je construis une application web avec Symfony 2, en utilisant le paquet FOSUserBundle.

Les utilisateurs créent un compte, se connectent et commencent à utiliser l'application.

ce que je veux réaliser maintenant, c'est que l'utilisateur soit redirigé vers son compte à partir de n'importe quelle page où il peut être s'il est connecté.

Cela comprend:

  • s'ils reviennent à la page de connexion
  • s'ils obtiennent retour à la page d'enregistrement
  • si ils vont à la page d'accueil du site
  • une fois qu'ils auront confirmé leur courriel
  • une fois qu'ils ont réinitialisé leur mot de passe

fondamentalement, le code serait quelque chose comme ceci:

$container = $this->container;
$accountRouteName = "DanyukiWebappBundle_account";
if( $container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
    // authenticated (NON anonymous)
    $routeName = $container->get('request')->get('_route');
    if ($routeName != $accountRouteName) {
        return $this->redirect($this->generateUrl($accountRouteName));
    }
}

le problème est que je ne sais pas où ce code devrait aller.

Il doit être exécuté pour toute requête. En Symfony 1 j'aurais utilisé un filtre.

14
demandé sur dan 2012-05-07 23:01:54

2 réponses

j'ai trouvé la solution moi-même:

<?php

namespace Danyuki\UserBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class LoggedInUserListener
{
    private $router;
    private $container;

    public function __construct($router, $container)
    {
        $this->router = $router;
        $this->container = $container;
    }    

    public function onKernelRequest(GetResponseEvent $event)
    {
        $container = $this->container;
        $accountRouteName = "DanyukiWebappBundle_account";
        if( $container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
            // authenticated (NON anonymous)
            $routeName = $container->get('request')->get('_route');
            if ($routeName != $accountRouteName) {
                $url = $this->router->generate($accountRouteName);
                $event->setResponse(new RedirectResponse($url));
            }
        }
    }
}

et puis, dans les services.fichier yml de mon paquet:

services:
    kernel.listener.logged_in_user_listener:
            class: Danyuki\UserBundle\Listener\LoggedInUserListener
            tags:
                - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
            arguments: [ @router, @service_container ]  
31
répondu dan 2012-05-09 08:42:21

vous pouvez également faire cette solution si vous voulez juste vérifier une fois:

il y a un événement déclenché chaque fois qu'il y a une connexion réussie. l'événement est nommé:

de sécurité.interactive_login

pour vous abonner à cet événement, vous devez créer un conteneur de service avec votre classe créée disons" LoginListener.php " et injecter la balise "noyau.even_listener "avec l'événement" sécurité.interactive_login":

<service id="mylogin.success.listener" class="path\to\class\LoginListener">
   <tag name="kernel.event_listener" event="security.interactive_login" method="onLoginSuccess" />
</service>

dans LoginListener:

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

public function onLoginSuccess(InteractiveLoginEvent $event) {
   if ($this->_security->isGranted('IS_AUTHENTICATED_FULLY')) {
      //your code here...
   }
}

vous pouvez également ajouter d'autres dépendances et l'injecter au constructeur, dans mon cas j'ai dû injecter la sécurité, la session et le conteneur:

public function __construct(SecurityContext $security, Session $session,            ContainerInterface $container) {

}
1
répondu Francis Alvin 2014-03-07 07:09:31