[英]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”。
你知道我做得不好嗎? 謝謝!
這可以是另一種解決方案:
如果需要更改響應,請使用處理程序而不是事件偵聽器。 更多信息請訪問: http : //www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
我找到了FOSUserBundle中使用的UrlGeneratorInterface
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.