<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Helper\UserHelper;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface as Router;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Security;
class RedirectUserSubscriber implements EventSubscriberInterface
{
/**
* @var Security $security
*/
public $security;
/**
* @var Router $router
*/
public $router;
/**
* @var string $passwordPolicyDeadline
*/
private string $passwordPolicyDeadline;
public function __construct(Security $security, Router $router, string $passwordPolicyDeadline)
{
$this->security = $security;
$this->router = $router;
$this->passwordPolicyDeadline = $passwordPolicyDeadline;
}
public function onKernelRequest(RequestEvent $event): void
{
$route = $event->getRequest()->get('_route');
$type = $event->getRequestType();
try {
if (HttpKernelInterface::MAIN_REQUEST === $type) {
/** @var User $user */
if ($user = $this->security->getUser()) {
$allowedRoutes = ['first_login', 'update_password', 'user_profile', 'supplier_profile', 'app_logout', 'app_reset_password', 'app_forgot_password_request'];
$passwordPolicyDeadline = new \DateTime($this->passwordPolicyDeadline);
$now = new \DateTime();
if ($now >= $passwordPolicyDeadline && !$user->isPasswordUpdatedForNewPolicy() && !in_array($route, $allowedRoutes)) {
$event->setResponse(new RedirectResponse($this->router->generate('update_password')));
return;
}
if (!$user->isSecured() && $route !== 'first_login') {
$event->setResponse(new RedirectResponse($this->router->generate('first_login')));
return;
}
}
$isAdmin = $this->security->isGranted('ROLE_ADMIN');
$isUser = $this->security->isGranted('ROLE_USER');
if (($isAdmin || $isUser) && $route == 'fos_user_security_login') {
$event->setResponse(new RedirectResponse($this->router->generate('dashboard')));
}
}
} catch (AuthenticationCredentialsNotFoundException $e) {
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
}