2014-12-10 3 views
0

Возможно ли в Symfony2 выйти из системы, которая была зарегистрирована на одной машине, когда пользователь входит в систему на другом компьютере?Ограничение входа пользователя на одну станцию ​​

Мое лицо пользователя имеет поле, содержащее идентификатор машины, в котором пользователь зашел на последнее место, и я подумал, что с помощью регистратора входа в систему для аннулирования сеанса предыдущего пользователя, но у меня нет успеха.

У вас есть идеи?

Благодаря

ответ

1

Вы можете использовать AuthenticationSuccessHandlerInterface, если пользователь предоставляет правильные учетные данные, а затем проверить идентификатор машины.

Посмотрите, например из моего приложения:

Define прослушиватель как сервис:

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'); 

     } 

    } 

} 

Курс e service machine.identifier - это ваш сервис, который предоставляет функции для получения/генерации/проверки вашего идентификатора машины. Вы должны выполнить эту услугу самостоятельно.

По каждому запросу вы должны проверить, постоянно ли пользователь находится на том же компьютере. Вы можете сделать это 2 способами:

  1. Если у вас есть свой собственный поставщик пользователя вы можете реализовать refreshUser метод ($ пользовательским интерфейсом пользователя).

  2. Зарегистрировать запрос слушателя.

Я покажу вам, как зарегистрировать запрос слушателя:

службы для данного слушателя:

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.

Надеюсь, это поможет.

+0

Большое вам спасибо! Это именно то, что я ищу! – Carles

Смежные вопросы