src/EventSubscriber/LoginSubscriber.php line 47

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Entity\LoginAttempt;
  5. use App\Entity\User;
  6. use DateTimeImmutable;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  10. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  11. final class LoginSubscriber implements EventSubscriberInterface
  12. {
  13.     public function __construct(private EntityManagerInterface $entityManager) {}
  14.     public static function getSubscribedEvents(): array
  15.     {
  16.         return [
  17.             LoginSuccessEvent::class => 'onLoginSuccessEvent',
  18.             LoginFailureEvent::class => 'onLoginFailureEvent',
  19.         ];
  20.     }
  21.     public function onLoginSuccessEvent(LoginSuccessEvent $event)
  22.     {
  23.         /** @var User $user */
  24.         $user $event->getUser();
  25.         $user->lastLogin = new \DateTimeImmutable();
  26.         $this->entityManager->persist($user);
  27.         $loginAttempt = new LoginAttempt();
  28.         $loginAttempt->user $user;
  29.         $loginAttempt->login $user->getUsername();
  30.         $loginAttempt->result LoginAttempt::RESULT_SUCCESS;
  31.         $loginAttempt->reason 'OK';
  32.         $loginAttempt->createdAt = new DateTimeImmutable();
  33.         $this->entityManager->persist($loginAttempt);
  34.         $this->entityManager->flush();
  35.     }
  36.     public function onLoginFailureEvent(LoginFailureEvent $event)
  37.     {
  38.         $username $event->getRequest()->get('_username');
  39.         $user $this->entityManager->getRepository(User::class)->findOneBy(['username' => $username]);
  40.         $loginAttempt = new LoginAttempt();
  41.         $loginAttempt->login $username;
  42.         $loginAttempt->user $user;
  43.         $loginAttempt->result LoginAttempt::RESULT_FAIL;
  44.         $loginAttempt->reason 'Nieudane logowanie';
  45.         $loginAttempt->createdAt = new DateTimeImmutable();
  46.         $this->entityManager->persist($loginAttempt);
  47.         $this->entityManager->flush();
  48.     }
  49. }