未调用Symfony 5 security.interactive_登录事件

未调用Symfony 5 security.interactive_登录事件,symfony,events,symfony5,symfony-security,symfony-eventdispatcher,Symfony,Events,Symfony5,Symfony Security,Symfony Eventdispatcher,我想使用security.interactive\u login事件来更新用户的上次登录字段 事件已成功注册: php bin/console调试:事件调度程序security.interactive\u登录 “security.interactive_login”事件的注册侦听器 =========================================================== ------- ----------------------------------------

我想使用
security.interactive\u login
事件来更新用户的上次登录字段

事件已成功注册:

php bin/console调试:事件调度程序security.interactive\u登录
“security.interactive_login”事件的注册侦听器
===========================================================
------- ------------------------------------------------------------------------ ----------
订单可调用优先级
------- ------------------------------------------------------------------------ ----------
#1 App\EventSubscriber\UserLocaleSubscriber::onSecurityInteractiveLogin()0
------- ------------------------------------------------------------------------ ----------
但它落在Symfony分析器中未调用的侦听器上

这是事件订阅服务器:

类UserLocaleSubscriber实现EventSubscriberInterface
{
私人股本$em;
公共函数构造(EntityManager接口$em)
{
$this->em=$em;
}
安全性Interactivelogin(InteractiveEngineent$事件)上的公共函数
{
/**@var User$User*/
$user=$event->getAuthenticationToken()->getUser();
$user->setLastLoginAt(new DateTime());
$this->em->persist($user);
$this->em->flush();
}
公共静态函数getSubscribedEvents()
{
返回[
SecurityEvents::INTERACTIVE_LOGIN=>“onSecurityInteractiveLogin”,
];
}
}
这是我的security.yaml文件:

安全性:
启用\u验证器\u管理器:true
编码器:
应用程序\实体\用户:
算法:自动
供应商:
应用程序\用户\提供商:
实体:
类别:应用程序\实体\用户
物业:电邮
防火墙:
开发人员:
模式:^/((档案器wdt)| css |图像| js |字体)/
安全性:错误
主要内容:
懒惰:是的
提供者:应用程序\用户\提供者
警卫:
认证者:
-应用程序\安全性\登录验证程序
注销:
路径:app\u注销
目标:应用程序登录#注销后重定向到哪里
记住我:
秘密:'%kernel.secret%'
寿命:604800#1周(秒)
路径:/
角色层次结构:
角色\管理员:角色\用户
角色超级管理员:角色管理员
#注意:仅使用匹配的*第一*访问控制
访问控制:
-{path:^/(?!login),角色:ROLE_ADMIN}
LoginAuthenticator类是Symfony默认生成的类

为什么不调用交互式登录事件?

使用新的(ish)身份验证管理器时,交互式登录事件将替换为LoginSAccessEvent

# my subscriber
    public static function getSubscribedEvents()
    {
        return [
            //SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
            LoginSuccessEvent::class => 'onLoginSuccess'
        ];
    }
    public function onLoginSuccess(LoginSuccessEvent $event)
    {
        $user = $event->getUser();
        $user->setCount($user->getCount() + 1);
        $this->em->flush();
        //dd($user);
    }
我不确定这是否有明确的记录。与许多升级折旧一样,代码非常混乱。我试图追踪正在发生的事情,但很快(再次)在安全森林中迷路了

人们谈论着各种事件

我通过创建一个新的5.1项目、运行make:auth并为这两个事件添加一个侦听器发现了这种行为。但是我忘了在安全配置中添加enable\u authenticator\u manager:true

因此,触发了INTERACTIVE_登录事件。启用新管理器后,LoginSAccessEvent被触发。请注意,新事件有一些附加的助手方法,例如getUser。使代码更干净一点


离题,但我要警告不要在侦听器中刷新实体管理器。这可能有点不可预测,这取决于其他情况。可以考虑只需获取数据库连接并执行SQL更新。

感谢在此持久性的通知!我不知道。事实上,我的实际代码在这里包含翻译逻辑,为了清晰起见,我用这个替换了它,但知道它总是好的:)是的,不幸的是Symfony文档还不是最新的。刚刚发送了一个请求更新它