src/EventSubscriber/SecuritySubscriber.php line 66

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Admin\Entity\StdUsers;
  4. use App\Admin\Entity\StdUsersLoginAudit;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use App\Event\StdWebUsersLoggedInEvent;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpFoundation\RequestStack;
  11. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  12. use Symfony\Component\Security\Http\Event\LogoutEvent;
  13. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  14. class SecuritySubscriber implements EventSubscriberInterface
  15. {
  16.     private $entityManager;
  17.     private $dispatcher;
  18.     private $requestStack;
  19.     public function __construct(
  20.         EntityManagerInterface $entityManager,
  21.         EventDispatcherInterface $dispatcher,
  22.         RequestStack $requestStack
  23.     ) {
  24.         $this->entityManager $entityManager;
  25.         $this->dispatcher $dispatcher;
  26.         $this->requestStack $requestStack;
  27.     }
  28.     
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             LoginSuccessEvent::class => ['onLoginSuccess'],
  33.             LogoutEvent::class => ['onLogout']
  34.         ];
  35.     }
  36.     
  37.     public function onLoginSuccess(LoginSuccessEvent $event): void
  38.     {
  39.         // Firewall name for webusers. Check config/packages/security.yaml
  40.         if ($event->getFirewallName() == 'main')
  41.         {
  42.             if ($event->getRequest()->isXmlHttpRequest())
  43.             {
  44.                 $currentResponse $event->getResponse();
  45.                 if ($currentResponse instanceof RedirectResponse)
  46.                 {
  47.                     $response = new JsonResponse([
  48.                         'targetUrl' => $currentResponse->getTargetUrl()
  49.                     ], \Symfony\Component\HttpFoundation\Response::HTTP_OK);
  50.                     $event->setResponse($response);
  51.                 }
  52.                 elseif (!$currentResponse instanceof JsonResponse) {
  53.                     $response = new JsonResponse(['success' => true'html'=>$currentResponse->getContent()], \Symfony\Component\HttpFoundation\Response::HTTP_OK);
  54.                     $event->setResponse($response);
  55.                 }
  56.             }
  57.                         $webUsersEvent=new StdWebUsersLoggedInEvent($event->getUser(), $event->getResponse());
  58.             $this->dispatcher->dispatch($webUsersEvent,StdWebUsersLoggedInEvent::NAME);
  59.         }
  60.     }
  61.     public function onLogout(LogoutEvent $event): void
  62.     {
  63.         $token $event->getToken();
  64.         
  65.         if (!$token) {
  66.             return;
  67.         }
  68.         
  69.         $user $token->getUser();
  70.         
  71.         // Only log if user is a StdUsers instance (backoffice users)
  72.         if (!$user instanceof StdUsers) {
  73.             return;
  74.         }
  75.         
  76.         $request $event->getRequest();
  77.         $session $request->getSession();
  78.         // NOT WORKING FOR NOW
  79.         // Get the login audit ID from session (stored during login)
  80.         $loginAuditId $session->get('_login_audit_id');
  81.         
  82.         if (!$loginAuditId) {
  83.             return;
  84.         }
  85.         
  86.         // Find the login audit record by ID
  87.         $loginAudit $this->entityManager
  88.             ->getRepository(StdUsersLoginAudit::class)
  89.             ->find($loginAuditId);
  90.         
  91.         // If found and not already logged out, update the logout timestamp and calculate session duration
  92.         if ($loginAudit && !$loginAudit->getLogoutTimestamp()) {
  93.             $logoutTime = new \DateTime();
  94.             $loginAudit->setLogoutTimestamp($logoutTime);
  95.             
  96.             // Calculate session duration in seconds
  97.             $loginTime $loginAudit->getLoginTimestamp();
  98.             $duration $logoutTime->getTimestamp() - $loginTime->getTimestamp();
  99.             $loginAudit->setSessionDuration($duration);
  100.             
  101.             $this->entityManager->persist($loginAudit);
  102.             $this->entityManager->flush();
  103.             
  104.             // Clean up the session variable
  105.             $session->remove('_login_audit_id');
  106.         }
  107.     }
  108. }