在Symfony2中手动登录后,用户对象为NULL

时间:2014-05-30 14:30:48

标签: symfony login listener

用户登录后,我会自动签名。

自动登录:

// Load $user from database, by activation hash and user id

$user->setLocked('no');
$user->setUnlockedAt(new \DateTime('now'));
$user->setLoginAt(new \DateTime('now'));
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();

$token = new UsernamePasswordToken($user->getUsername(), null, 'main', $user->getRoles()); // "main" = firewall name

$this->get('security.context')->setToken($token); //now the user is logged in

// Now dispatch the login event

$request = $this->get('request');
$event = new InteractiveLoginEvent($request, $token);
$this->get('event_dispatcher')->dispatch('security.interactive_login', $event);

$this->get('session')->set('_security_' . 'main', serialize($token));

好的,现在我添加了一个控制器监听器。我希望每次使用控制器更新数据库中用户的“最后活动时间戳”时都会触发它。现在就是它的样子。

在service.yml中,我设置了监听器事件:

services:
  controller_listener:
    class: 'MyComp\MyBundle\Listener\ControllerListener'
    arguments: ['@security.context', '@doctrine']
    tags:
      - { name: 'kernel.event_listener', event: 'kernel.controller', method: 'onKernelController' }

听众本身:

<?php

    namespace MyCOmp\MyBundle\Listener;

    use Symfony\Component\Security\Core\SecurityContext;
    use Doctrine\Bundle\DoctrineBundle\Registry;

    class ControllerListener {

        protected $security_context;
        protected $doctrine;

        public function __construct(SecurityContext $securityContext, Registry $doctrine) {
            $this->security_context = $securityContext;
            $this->em = $doctrine->getManager();
        }

        public function onKernelController($event) {

            $controller = $event->getController();

            $token = $this->security_context->getToken();

            if (!is_null($token) && is_object($token->getUser())) {

                $user = $token->getUser();
                $user->setActivityAt(new \DateTime('now'));
                $this->em->persist($user);
                $this->em->flush();

            }

            $event->setController($controller);

        }

    }

如您所见,我使用$ token = $ this-&gt; security_context-&gt; getToken(); $ token-&gt; getUser()获取用户对象以设置“Activity At”值(最后一个活动时间戳)。

现在,发生了什么: 用户“自动”登录后,$ token-&gt; getUser()不是对象。每次使用控制器。 但是在通过symfony2表单(login_check等)进行传统登录后,$ token-&gt; getUser()是一个有效的用户对象。

这怎么可能,这里有什么不对?

我认为自动登录存在问题,因此登录过程不完整。 有没有忘记的电话?

所以我希望你能帮助我。

问候

1 个答案:

答案 0 :(得分:1)

也许你忘了

$token->setUser($user);

在将其分配给security.context之前?