gpt4 book ai didi

security - Symfony2 登录事件监听器和 security.interactive_login 事件从未使用 FOSUser 触发

转载 作者:行者123 更新时间:2023-12-02 19:33:02 25 4
gpt4 key购买 nike

我正在尝试添加一个 Symfony2 登录事件监听器,目标是在用户登录时在每个请求上设置数据库存储的区域设置,并回退到没有用户登录的默认区域设置。我使用 FOSUserBundle,并且正在尝试让 security.interactive_login 事件正常工作。我在互联网上找到了很多这样的代码:http://dev.dbl-a.com/symfony-2-0/how-to-add-a-symfony2-login-event-listener/

我有自己的 FOSUserBundle 子包,并且在 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 }

问题是,即使在记录时,也永远不会触发 security.interactive_login 事件。相反,我的 setLocaleForUnauthenticatedUser 总是被触发。我发现的每个代码示例似乎都运行流畅,我的应用程序出了什么问题?

最佳答案

也想通了,并做了或多或少相同的工作:确实没有问题,但是登录后存在某种重定向,因此分析器永远不会显示触发交互式登录监听器的实际请求。

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 中:

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 - Symfony2 登录事件监听器和 security.interactive_login 事件从未使用 FOSUser 触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13973389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com