<?php
namespace App\EventSubscriber;
use App\Entity\User;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Security\Core\Security;
/**
* Met à jour les données de sécurité de l'utilisateur (ip, user agent and last login time) à chaque request avec une intervale
*/
class UserSecurityUpdateSubscriber implements EventSubscriberInterface
{
private const UPDATE_INTERVAL = 10;
public function __construct(private EntityManagerInterface $em, private Security $security)
{
}
public function onKernelRequest(RequestEvent $event)
{
/** @var User $user */
$user = $this->security->getUser();
if (null === $user || $event->getRequestType() !== HttpKernelInterface::MAIN_REQUEST) {
return;
}
$request = $event->getRequest();
$ip = $request->server->get('REMOTE_ADDR');
$userAgent = $request->server->get('HTTP_USER_AGENT');
$now = new DateTimeImmutable();
$dateCheck = new DateTimeImmutable('now -'.self::UPDATE_INTERVAL.'minutes');
if (
$user->getIp() !== $ip
|| $user->getUserAgent() !== $userAgent
|| $user->getLastLoginAt() === null
|| $user->getLastLoginAt() < $dateCheck) {
$user->setIp($ip)
->setUserAgent($userAgent)
->setLastLoginAt($now);
$this->em->flush($user);
}
}
public static function getSubscribedEvents()
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}