如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2
Posted
技术标签:
【中文标题】如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2【英文标题】:How redirect in onSecurityInteractiveLogin method in LoginListener - Symfony2 【发布时间】:2012-02-16 19:52:40 【问题描述】:我们想在登录后重定向到一个或另一个路径。我们还需要在这条路径中传递 de 语言。
我们有一个登录侦听器作为服务来检查这一点。我们的问题是做重定向动作。 代码:
<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>
开启 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;
但是如果我执行网络应用程序,它不会进入这个函数并且不会显示“Hello world”。
你知道我做错了什么吗? 谢谢!
【问题讨论】:
【参考方案1】:如果您需要更改响应,请使用处理程序而不是事件侦听器。更多信息在这里:http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
【讨论】:
您好 TheOnly92,感谢您的回答。我试图在我的代码中使用处理程序,但它不起作用。我想我可能忘记了什么。当我登录时,应用程序不会进入 onAuthenticationSucess。我配置 services.XML 和 security.yml 示例如何显示 我又试了一次,效果很好。 @theonly92 发送的链接是我们目的的答案。谢谢! 那个链接现在好像坏了。【参考方案2】:我找到了 FOSUserBundle 中使用的 UrlGeneratorInterface
FosUserBundle Hooking into controllers
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
...
public function __construct(UrlGeneratorInterface $router)
$this->router = $router;
...
...
$url = $this->router->generate('homepage');
【讨论】:
以上是关于如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2的主要内容,如果未能解决你的问题,请参考以下文章
HttpServletReqeustHttpServletResponse
HttpServletReqeustHttpServletResponse