将用户登录限制为一个站点

时间:2014-12-10 11:53:51

标签: symfony

在Symfony2中,当用户登录另一台计算机时,是否可以注销已登录到一台计算机的用户?

我的用户实体有一个字段,其中包含用户已登录到最后位置的机器标识符,我曾想过使用登录侦听器使前一个用户的会话无效,但我没有成功。

¿你有什么想法吗?

由于

1 个答案:

答案 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的功能。您必须自己实施此服务。

在每个请求中,您必须检查用户是否始终在同一台计算机上。 你可以用两种方式做到这一点:

  1. 如果您有自己的用户提供程序,则可以实现refreshUser(UserInterface $ user)方法。

  2. 注册请求监听器。

  3. 我将向您展示如何注册请求监听器:

    此侦听器的服务:

    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.

    希望它有所帮助。