src/EventSubscriber/UserLoginSubscriber.php line 34

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 EntityManagerInterface $em;
  15.     public function __construct(
  16.         private LoggerInterface $logger,
  17.         ManagerRegistry $registry
  18.     )
  19.     {
  20.         $this->em $registry->getManagerForClass(LoginLog::class);
  21.     }
  22.     public static function getSubscribedEvents()
  23.     {
  24.         return [
  25.             InteractiveLoginEvent::class => 'onLogin',
  26.         ];
  27.     }
  28.     public function onLogin(InteractiveLoginEvent $event): void
  29.     {
  30.         $authenticationToken $event->getAuthenticationToken();
  31.         $user $authenticationToken->getUser();
  32.         if (!$user instanceof User) {
  33.             return;
  34.         }
  35.         $request $event->getRequest();
  36.         $clientIp $request->getClientIp();
  37.         $mode in_array(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED$authenticationToken->getRoleNames())
  38.             ? 'remember_me' 'password';
  39.         $this->logger->info('User {user} [{user_id}] authenticated with "{mode}".', [
  40.             'user' => $user->getUsername(),
  41.             'user_id' => $user->getId(),
  42.             'mode' => $mode,
  43.             'client_ip' => $clientIp,
  44.         ]);
  45.         $logRecord = new LoginLog($userCarbonImmutable::now(), $mode$clientIp);
  46.         $this->em->persist($logRecord);
  47.         $this->em->flush();
  48.     }
  49. }