在Symfony2中,当用户登录另一台计算机时,是否可以注销已登录到一台计算机的用户?
我的用户实体有一个字段,其中包含用户已登录到最后位置的机器标识符,我曾想过使用登录侦听器使前一个用户的会话无效,但我没有成功。
¿你有什么想法吗?
由于
答案 0 :(得分:1)
如果用户提供了正确的凭据,您可以使用AuthenticationSuccessHandlerInterface
,然后检查计算机ID。
从我的应用程序中查看示例:
将您的侦听器定义为服务:
services:
blogjakon.user.authentication_handler:
class: BlogJakon\UserBundle\ActionListener\AuthenticationHandler
calls:
- [ setContainer, [ @service_container ] ]
security.yml:
form_login:
[...]
success_handler: blogjakon.user.authentication_handler
听众课程:
class AuthenticationHandler extends ContainerAware implements AuthenticationSuccessHandlerInterface{
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$templating = $this->container->get('templating');
$machineIdentifier = $this->container->get('machine.identifier');
if( $token->getUser()->getMachineId() == $machineIdentifier->getCurrentId() )
{
return $templating->renderResponse('yourBundle::logged.html.twig');
}
else
{
// Update user entity with new machineId and redirect.
return $templating->renderResponse('yourBundle::logged-in-new-machine.html.twig');
}
}
}
当然,服务machine.identifier
是您的服务,提供获取/生成/检查您的计算机ID的功能。您必须自己实施此服务。
在每个请求中,您必须检查用户是否始终在同一台计算机上。 你可以用两种方式做到这一点:
如果您有自己的用户提供程序,则可以实现refreshUser(UserInterface $ user)方法。
注册请求监听器。
我将向您展示如何注册请求监听器:
此侦听器的服务:
services:
listener.requestresponse:
class: My\AwesomeBundle\Listener\MyListener
arguments: [ @service_container ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
听众课程:
class MyListener
{
protected $container;
public function __construct(ContainerInterface $container) // this is @service_container
{
$this->container = $container;
}
public function onKernelRequest(GetResponseEvent $event)
{
$securityContex = $this->get('security.context');
$machineIdentifier = $this->container->get('machine.identifier');
if( $securityContext>getToken()->getUser()>getMachineId() != $machineIdentifier->getCurrentId() )
$this->get('security.context')->setToken(NULL);
}
}
此示例来自this question.
希望它有所帮助。