Symfony2登录事件侦听器和security.interactive_登录事件从未使用FOSUser触发
我正在尝试添加一个Symfony2登录事件监听器,目标是在每个请求上设置一个数据库存储的区域设置(如果用户已登录),并返回到默认设置(如果没有用户登录)。 我使用FOSUserBundle,并试图让security.interactive\u登录事件正常工作。我在互联网上找到了很多这样的代码: 我有自己的FOSUserBundle子包和services.yml中的这个实现:Symfony2登录事件侦听器和security.interactive_登录事件从未使用FOSUser触发,security,events,symfony,login,fosuserbundle,Security,Events,Symfony,Login,Fosuserbundle,我正在尝试添加一个Symfony2登录事件监听器,目标是在每个请求上设置一个数据库存储的区域设置(如果用户已登录),并返回到默认设置(如果没有用户登录)。 我使用FOSUserBundle,并试图让security.interactive\u登录事件正常工作。我在互联网上找到了很多这样的代码: 我有自己的FOSUserBundle子包和services.yml中的这个实现: my_user.security.interactive_login_listener: class: M
my_user.security.interactive_login_listener:
class: My\UserBundle\EventListener\UserListener
arguments: [@security.context, @doctrine]
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }
my_user.security.kernel_request_listener:
class: My\UserBundle\EventListener\UserListener
arguments: [@security.context, @doctrine]
tags:
- { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser }
user.locales.kernel_request_listener:
class: Acme\UserBundle\EventListener\LocaleListener
arguments: [ @service_container, [ 'en', 'fr', 'ru' ] ]
tags: [{ name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -255 }]
问题是,security.interactive_登录事件永远不会触发,即使在登录时也不会触发。相反,始终触发我的setLocaleForUnauthenticatedUser。
我发现的每一个代码示例都能流畅地工作,我的应用程序有什么问题吗?这里也有同样的问题。但问题不在于事件没有被触发。问题是重定向后,请求区域设置丢失。借助此链接的帮助: (并基于) 我想出了解决办法。在UserListener中:
class UserListener
{
private $session;
public function setSession($session) {
$this->session = $session;
}
public function setLocaleForUnauthenticatedUser(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$request = $event->getRequest();
if ('undefined' == $request->getLocale()) {
if($locale = $request->getSession()->get('_locale')) {
$request->setLocale($locale);
} else {
$request->setLocale($request->getPreferredLanguage());
}
}
}
public function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();
if ($locale = $user->getLocale()) {
// $event->getRequest()->setLocale($user->getLocale());
$this->session->set('_locale', $locale);
}
}
}
在services.yml中,您应该声明:
your_listener_name:
class: ...\UserBundle\EventListener\UserListener
calls:
- [ setSession, ['@session'] ]
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }
希望这能有所帮助。也找到了答案,并做了大致相同的工作: 这确实没有问题,但在登录后会有某种重定向,因此探查器不会显示触发交互式登录侦听器的实际请求
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent,
Symfony\Component\Security\Http\Event\FilterControllerEvent,
Symfony\Component\HttpKernel\Event\GetResponseEvent,
Symfony\Component\HttpKernel\HttpKernelInterface;
use FOS\UserBundle\Entity\User as BaseUser;
class LocaleListener {
protected $container;
protected $availableLocales;
public function __construct(\Symfony\Component\DependencyInjection\Container $container, $availableLocales) {
$this->container = $container;
$this->availableLocales = $availableLocales;
}
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
$locale = $request->getPreferredLanguage($this->availableLocales);
$session = $request->getSession();
$token = $this->container->get('security.context')->getToken();
if( is_object( $token ) ) {
$user = $token->getUser();
if ($user instanceof BaseUser) {
$locale = $user->getLocale();
}
}
$session = $this->container->get('session');
$session->set('_locale', $locale);
$request->setLocale($locale);
}
}
在services.yml中:
my_user.security.interactive_login_listener:
class: My\UserBundle\EventListener\UserListener
arguments: [@security.context, @doctrine]
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }
my_user.security.kernel_request_listener:
class: My\UserBundle\EventListener\UserListener
arguments: [@security.context, @doctrine]
tags:
- { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser }
user.locales.kernel_request_listener:
class: Acme\UserBundle\EventListener\LocaleListener
arguments: [ @service_container, [ 'en', 'fr', 'ru' ] ]
tags: [{ name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -255 }]
symfony2的分支版本和FOSUserBundle的版本是什么?