Вы можете использовать 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 способами:
Если у вас есть свой собственный поставщик пользователя вы можете реализовать refreshUser метод ($ пользовательским интерфейсом пользователя).
Зарегистрировать запрос слушателя.
Я покажу вам, как зарегистрировать запрос слушателя:
службы для данного слушателя:
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.
Надеюсь, это поможет.
Большое вам спасибо! Это именно то, что я ищу! – Carles