<?phpnamespace App\EventSubscriber;use App\Admin\Entity\StdUsers;use App\Admin\Entity\StdUsersLoginAudit;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use App\Event\StdWebUsersLoggedInEvent;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\Security\Http\Event\LoginSuccessEvent;use Symfony\Component\Security\Http\Event\LogoutEvent;use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;class SecuritySubscriber implements EventSubscriberInterface{ private $entityManager; private $dispatcher; private $requestStack; public function __construct( EntityManagerInterface $entityManager, EventDispatcherInterface $dispatcher, RequestStack $requestStack ) { $this->entityManager = $entityManager; $this->dispatcher = $dispatcher; $this->requestStack = $requestStack; } public static function getSubscribedEvents(): array { return [ LoginSuccessEvent::class => ['onLoginSuccess'], LogoutEvent::class => ['onLogout'] ]; } public function onLoginSuccess(LoginSuccessEvent $event): void { // Firewall name for webusers. Check config/packages/security.yaml if ($event->getFirewallName() == 'main') { if ($event->getRequest()->isXmlHttpRequest()) { $currentResponse = $event->getResponse(); if ($currentResponse instanceof RedirectResponse) { $response = new JsonResponse([ 'targetUrl' => $currentResponse->getTargetUrl() ], \Symfony\Component\HttpFoundation\Response::HTTP_OK); $event->setResponse($response); } elseif (!$currentResponse instanceof JsonResponse) { $response = new JsonResponse(['success' => true, 'html'=>$currentResponse->getContent()], \Symfony\Component\HttpFoundation\Response::HTTP_OK); $event->setResponse($response); } } $webUsersEvent=new StdWebUsersLoggedInEvent($event->getUser(), $event->getResponse()); $this->dispatcher->dispatch($webUsersEvent,StdWebUsersLoggedInEvent::NAME); } } public function onLogout(LogoutEvent $event): void { $token = $event->getToken(); if (!$token) { return; } $user = $token->getUser(); // Only log if user is a StdUsers instance (backoffice users) if (!$user instanceof StdUsers) { return; } $request = $event->getRequest(); $session = $request->getSession(); // NOT WORKING FOR NOW // Get the login audit ID from session (stored during login) $loginAuditId = $session->get('_login_audit_id'); if (!$loginAuditId) { return; } // Find the login audit record by ID $loginAudit = $this->entityManager ->getRepository(StdUsersLoginAudit::class) ->find($loginAuditId); // If found and not already logged out, update the logout timestamp and calculate session duration if ($loginAudit && !$loginAudit->getLogoutTimestamp()) { $logoutTime = new \DateTime(); $loginAudit->setLogoutTimestamp($logoutTime); // Calculate session duration in seconds $loginTime = $loginAudit->getLoginTimestamp(); $duration = $logoutTime->getTimestamp() - $loginTime->getTimestamp(); $loginAudit->setSessionDuration($duration); $this->entityManager->persist($loginAudit); $this->entityManager->flush(); // Clean up the session variable $session->remove('_login_audit_id'); } }}