src/EventSubscriber/UserLoginSubscriber.php line 33

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