<?php
namespace App\Handler;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
/**
* Class SessionIdleHandler
* @package App\Handler
*/
class SessionIdleHandler
{
protected $session;
protected $tokenStorage;
protected $router;
protected $maxIdleTime;
protected $authorizationChecker;
/**
* SessionIdleHandler constructor.
* @param SessionInterface $session
* @param TokenStorageInterface $tokenStorage
* @param RouterInterface $router
* @param AuthorizationChecker $authorizationChecker
* @param int $maxIdleTime
*/
public function __construct(
SessionInterface $session,
TokenStorageInterface $tokenStorage,
RouterInterface $router,
AuthorizationChecker $authorizationChecker,
$maxIdleTime = 0
) {
$this->session = $session;
$this->tokenStorage = $tokenStorage;
$this->router = $router;
$this->maxIdleTime = $maxIdleTime;
$this->authorizationChecker = $authorizationChecker;
}
/**
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) {
return;
}
if ($this->maxIdleTime > 0) {
$this->session->start();
$lapse = time() - $this->session->getMetadataBag()->getLastUsed();
if ($lapse > $this->maxIdleTime && $this->authorizationChecker->isGranted('ROLE_USER')) {
$this->tokenStorage->setToken(null);
$event->setResponse(
new RedirectResponse(
$this->router->generate(
'security_login',
['session_idle' => true]
)
)
);
}
}
}
}