如何使用EventListener在登录成功后重定向

时间:2014-05-07 12:40:03

标签: symfony fosuserbundle event-listener

我在事件监听器的代码中遇到问题,因为我在登录时需要创建一个EventListener,类型为1 ==>重定向到:

 return $this->redirect($this->generateUrl('demands_patient')); 

else重定向到另一个路径。这是loginlistener的代码

use Doctrine\ORM\Event\LifecycleEventArgs;
use Register\UserBundle\Entity\User;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class LoginListener implements EventSubscriberInterface
{
     private $router;

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


    public static function onSecurityInteractiveLogin()
    {
        return array(
            FOSUserEvents::AUTHENTICATION_SUCCESS => 'redirectlogin',
        );
    }

    public function redirectlogin(InteractiveLoginEvent $event)
    {
        $user = $event->getUser();


         if($user->getType()=="1")
                 {
                    return $this->redirect($this->generateUrl('demands_patient')); 
                 }
         else 
                    {
                   return $this->redirect($this->generateUrl('demands')); 
                    }
    }
}

我在services.yml中添加配置:

register_user.eventlistener.loginlistener:
        class: Register\UserBundle\EventListener\LoginListener
        arguments: [@router]
        tags:
            - { name: kernel.onSecurityInteractiveLogin }

1 个答案:

答案 0 :(得分:1)

就在今天,我遇到了类似的问题。 我的解决方案是使用Handler而不是Listener,如http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/

中所述

我做的是:

在我的包中,“services.yml':

parameters:
    cambra_comunitats.handler.user_login_redirect_handler.class: Cambra\ComunitatsBundle\Handler\UserLoginRedirectHandler

services:
  cambra_comunitats.handler.user_login_redirect_handler:
    class: "%cambra_comunitats.handler.user_login_redirect_handler.class%"
    arguments:  [@router, @security.context]
    tags:
      - { name: 'monolog.logger', channel: 'security' } 

然后,我创建了Cambra\ComunitatsBundle\Handler\UserLoginRedirectHandler类:     

class UserLoginRedirectHandler implements \Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface
{
  protected $router;
  protected $security;

  public function __construct(\Symfony\Component\Routing\Router $router, \Symfony\Component\Security\Core\SecurityContext $security)
  {
    $this->router = $router;
    $this->security = $security;
  }

  public function onAuthenticationSuccess(\Symfony\Component\HttpFoundation\Request $request, \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token)
  {
    if ($this->security->isGranted('ROLE_ADMIN') && $this->security->getToken()->getUser()->isMustRedirect())
    {
      $response = new \Symfony\Component\HttpFoundation\RedirectResponse($this->router->generate('new_destination'));
    } else
    {
      $referer_url = $this->router->generate('index_page');
      $response = new \Symfony\Component\HttpFoundation\RedirectResponse($referer_url);
    }
    return $response;
  }
}

最后,我在security.ymlfirewalls.main.form_login启用了它:

//.....
firewalls:
  //...
  main:
    //...
    form_login:
      //...
      success_handler: cambra_comunitats.handler.user_login_redirect_handler