簡體   English   中英

如何重定向LoginListener中的onSecurityInteractiveLogin方法 - Symfony2

[英]How redirect in onSecurityInteractiveLogin method in LoginListener - Symfony2

我們希望在登錄后重定向到路徑或其他路徑。 我們還需要在這條路徑中傳遞de語言。

我們有一個Login Listener作為服務來檢查這個。 我們的問題是做重定向。 碼:

<service id="acme.login_listener" class="acme\DemoBundle\Listener\LoginListener">
   <tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin" priority="-1" />
   <tag name="kernel.event_listener" event="filter.response" method="onKernelResponse" />            
   <argument type="service" id="service_container" />  
   <argument type="service" id="router" />          
</service>

監聽器代碼:

namespace Acme\DemoBundle\Listener;

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

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;

class LoginListener 
{
    protected $container;
    protected $router;

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

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {                
        $token = $event->getAuthenticationToken();
        $request = $event->getRequest();

        $username = $token->getUsername();

        $em = $this->container->get('doctrine')->getEntityManager();

        $user = $em->getRepository('acmeDemoBundle:User')->findOneByUsername($username);


        $locale = strtolower($user->getUsuari()->getIdioma()->getCodi6391());
        $locale = 'ca';  //force locale test

        $session = $request->getSession();
        $session->setLocale($locale);          
        $session->set('idioma', $locale);    
        $session->set('_locale', $locale); 
        $session->set('locale', $locale);

        $url = $this->router->generate('onePath', array('_locale' => $locale));

        //$event->setResponse(new RedirectResponse($url));
        //$event->stopPropagation();
        //echo $url;exit;

        $response = new RedirectResponse($url);            
        return $response;  
...

我們的問題是在onSecurityInteractiveLogin函數中重定向到所希望的路徑。

我們嘗試執行$ event-> setResponse但它不起作用。 這個$ event var沒有這個方法。

任何的想法? 謝謝你的幫助。


編輯:第二個選項(2012年1月27日)

以下: http//www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/

我試圖使用處理程序。 我配置了services.xml:

<service id="company.login_success_handler" class="project\demoBundle\Handler\LoginSucessHandler">
    <tag name="monolog.logger" channel="project" />
    <argument type="service" id="logger" /> 
    <argument type="service" id="router" />          
</service>

ON security.yml:

firewalls:
    main:
        pattern: /.*
        form_login:
            check_path: /login_check
            login_path: /login
            success_handler: company.login_success_handler
            use_forward: false

在Symfony / src / project / demoBundle / Handler / loginSuccessHandler.php中

<?php 

namespace project\demoBundle\Handler; 

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\SecurityContext; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Routing\Router; 

class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface 
{ 

  protected $router; 
  protected $security; 

  public function __construct(Router $router, SecurityContext $security) 
  { 
    $this->router = $router; 
    $this->security = $security; 
    echo "hello world";exit;
  } 

  public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
  { 

    echo "hello world 2";exit;
    if ($this->security->isGranted('ROLE_SUPER_ADMIN')) 
    { 
      $response = new RedirectResponse($this->router->generate('category_index'));       
    } 
    elseif ($this->security->isGranted('ROLE_ADMIN')) 
    { 
      $response = new RedirectResponse($this->router->generate('category_index')); 
    }  
    elseif ($this->security->isGranted('ROLE_USER')) 
    { 
      // redirect the user to where they were before the login process begun. 
      $referer_url = $request->headers->get('referer'); 

      $response = new RedirectResponse($referer_url); 
    } 

    return $response; 
  } 

}

但是,如果我執行Web應用程序,它不會進入此功能,並且不會顯示“Hello world”。

你知道我做得不好嗎? 謝謝!

這可以是另一種解決方案:

https://gist.github.com/snc/1312769

如果需要更改響應,請使用處理程序而不是事件偵聽器。 更多信息請訪問: http//www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/

我找到了FOSUserBundle中使用的UrlGeneratorInterface

FosUserBundle掛鈎到控制器

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
...

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

$url = $this->router->generate('homepage');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM