src/EventSubscriber/UserLoginSubscriber.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Account\LoginLog;
  4. use App\Entity\User;
  5. use App\Mautic\Marketing\MauticContactActivityUpdater;
  6. use Carbon\CarbonImmutable;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
  12. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  13. class UserLoginSubscriber implements EventSubscriberInterface
  14. {
  15.     private LoggerInterface $logger;
  16.     private EntityManagerInterface $em;
  17.     public function __construct(
  18.         LoggerInterface $authLogger,
  19.         ManagerRegistry $registry,
  20.         private MauticContactActivityUpdater $mauticContactActivityUpdater
  21.     )
  22.     {
  23.         $this->logger = $authLogger;
  24.         $this->em = $registry->getManagerForClass(LoginLog::class);
  25.     }
  26.     public static function getSubscribedEvents()
  27.     {
  28.         return [
  29.             InteractiveLoginEvent::class => 'onLogin',
  30.         ];
  31.     }
  32.     public function onLogin(InteractiveLoginEvent $event): void
  33.     {
  34.         $authenticationToken = $event->getAuthenticationToken();
  35.         $user = $authenticationToken->getUser();
  36.         if (!$user instanceof User) {
  37.             return;
  38.         }
  39.         $request = $event->getRequest();
  40.         $clientIp = $request->getClientIp();
  41.         $mode = in_array(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED, $authenticationToken->getRoleNames())
  42.             ? 'remember_me' : 'password';
  43.         $this->logger->info('User {user} [{user_id}] authenticated with "{mode}".', [
  44.             'user' => $user->getUsername(),
  45.             'user_id' => $user->getId(),
  46.             'mode' => $mode,
  47.             'client_ip' => $clientIp,
  48.         ]);
  49.         $loggedAt = CarbonImmutable::now();
  50.         $logRecord = new LoginLog($user, $loggedAt, $mode, $clientIp);
  51.         $this->em->persist($logRecord);
  52.         $this->em->flush();
  53.         $this->mauticContactActivityUpdater->markLastLogin($user, $loggedAt);
  54.     }
  55. }