<?php
namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Controller\ErrorController;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Event\LogoutEvent;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Exception\InactiveUserException;
use App\Controller\UserController;
use App\Controller\AdministratorController;
use App\Controller\AdminOwnerController;
use App\Controller\SuperAdminController;
use App\Security\RoleSwitcher;
// Note: this is actually a subscriber, not a listener
class RequestListener implements EventSubscriberInterface
{
private $entityManager;
private $security;
private $urlGenerator;
public function __construct(EntityManagerInterface $em, Security $security, UrlGeneratorInterface $urlGenerator) {
$this->entityManager = $em;
$this->security = $security;
$this->urlGenerator = $urlGenerator;
}
public function onKernelController(ControllerEvent $event)
{
$user = $this->security->getUser();
$securityToken = $this->security->getToken();
$controller = $event->getController();
if (is_array($controller)) $controller = $controller[0];
if ($controller instanceof ErrorController) return;
if ($user !== null && ! $user->isActive()) {
$this->security->getToken()->setAuthenticated(false);
throw new InactiveUserException("La tua utenza รจ stata disattivata");
}
//set last activity for users
if ($event->getRequestType() === HttpKernelInterface::MAIN_REQUEST && $controller instanceof UserController && $user !== null && ! $securityToken instanceof SwitchUserToken) {
$user->setLastActivity(new \DateTime());
$this->entityManager->flush();
}
//set active role in session
if ($user !== null && $event->getRequestType() === HttpKernelInterface::MAIN_REQUEST) {
$switcher = $event->getRequest()->getSession()->get('roleSwitcher');
if ($switcher === null) {
$switcher = new RoleSwitcher();
$event->getRequest()->getSession()->set('roleSwitcher',$switcher);
}
if ($controller instanceof UserController) {
$switcher->setActiveRole(RoleSwitcher::USER);
} elseif ($controller instanceof AdministratorController || $controller instanceof AdminOwnerController) {
$switcher->setActiveRole(RoleSwitcher::ADMIN);
} elseif ($controller instanceof SuperAdminController) {
$switcher->setActiveRole(RoleSwitcher::SUPER_ADMIN);
}
}
}
public function onLogout(LogoutEvent $event)
{
$user = $event->getToken()->getUser();
$user->setLastActivity(null);
$this->entityManager->flush();
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
LogoutEvent::class => 'onLogout',
];
}
}