用户登录后,我会自动签名。
自动登录:
// 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()是一个有效的用户对象。
这怎么可能,这里有什么不对?
我认为自动登录存在问题,因此登录过程不完整。 有没有忘记的电话?
所以我希望你能帮助我。
问候
答案 0 :(得分:1)
也许你忘了
$token->setUser($user);
在将其分配给security.context
之前?