Symfony2:成功登录事件后,执行一组操作

jbs*_*und 26 php symfony

我需要在用户成功登录后执行一系列操作.这包括从数据库加载数据并将其存储在会话中.

实现这个的最佳方法是什么?

MDr*_*tte 53

您可以为security.interactive_login事件添加侦听器.

像这样附上你的听众.在此示例中,我还将安全上下文和会话作为依赖项传递.

注意:从Symfony 2.6开始,不推荐使用SecurityContext.请参阅 http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

parameters:
   # ...

   account.security_listener.class: Company\AccountBundle\Listener\SecurityListener

services:
   # ...

   account.security_listener:
        class: %account.security_listener.class%
        arguments: ['@security.context', '@session']
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }
Run Code Online (Sandbox Code Playgroud)

在你的听众中,你可以在会话中存储你想要的任何内容.在这种情况下,我设置用户时区.

<?php

namespace Company\AccountBundle\Listener;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

class SecurityListener
{

   public function __construct(SecurityContextInterface $security, Session $session)
   {
      $this->security = $security;
      $this->session = $session;
   }

   public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
   {
        $timezone = $this->security->getToken()->getUser()->getTimezone();
        if (empty($timezone)) {
            $timezone = 'UTC';
        }
        $this->session->set('timezone', $timezone);
   }

}
Run Code Online (Sandbox Code Playgroud)

  • 您不需要注入SecurityContext和Session,您可以使用$ event-> getAuthenticationToken()和$ event-> getRequest() - > getSession()从InteractiveLoginEvent中获取它. (25认同)
  • 大多数人使用YML而不是XML.转换它真是一件令人头疼的事! (3认同)

rob*_*ten 8

您甚至可以从事件本身获取用户实例,无需注入令牌存储!

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
    $event->getAuthenticationToken()->getUser()
}
Run Code Online (Sandbox Code Playgroud)