src/EventSubscriber/UserSecurityUpdateSubscriber.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\User;
  4. use DateTimeImmutable;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\HttpKernelInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. /**
  11.  * Met à jour les données de sécurité de l'utilisateur (ip, user agent and last login time) à chaque request avec une intervale
  12.  */
  13. class UserSecurityUpdateSubscriber implements EventSubscriberInterface
  14. {
  15.     private const UPDATE_INTERVAL 10;
  16.     public function __construct(private EntityManagerInterface $em, private Security $security)
  17.     {
  18.     }
  19.     public function onKernelRequest(RequestEvent $event)
  20.     {
  21.         /** @var User $user */
  22.         $user $this->security->getUser();
  23.         if (null === $user || $event->getRequestType() !== HttpKernelInterface::MAIN_REQUEST) {
  24.             return;
  25.         }
  26.         $request $event->getRequest();
  27.         $ip $request->server->get('REMOTE_ADDR');
  28.         $userAgent $request->server->get('HTTP_USER_AGENT');
  29.         $now = new DateTimeImmutable();
  30.         $dateCheck = new DateTimeImmutable('now -'.self::UPDATE_INTERVAL.'minutes');
  31.         if (
  32.             $user->getIp() !== $ip
  33.             || $user->getUserAgent() !== $userAgent
  34.             || $user->getLastLoginAt() === null
  35.             || $user->getLastLoginAt() < $dateCheck) {
  36.             $user->setIp($ip)
  37.                 ->setUserAgent($userAgent)
  38.                 ->setLastLoginAt($now);
  39.             $this->em->flush($user);
  40.         }
  41.     }
  42.     public static function getSubscribedEvents()
  43.     {
  44.         return [
  45.             'kernel.request' => 'onKernelRequest',
  46.         ];
  47.     }
  48. }