src/EventSubscriber/AuthenticatorSubscriber.php line 66

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Log;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\AuthenticationEvents;
  9. use Symfony\Component\Security\Core\Event\AuthenticationEvent;
  10. use Symfony\Component\Security\Core\Event\AuthenticationFailureEvent;
  11. use Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent;
  12. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  13. use Symfony\Component\Security\Http\Event\LogoutEvent;
  14. use Symfony\Component\Security\Http\SecurityEvents;
  15. class AuthenticatorSubscriber implements EventSubscriberInterface
  16. {
  17.     private $manager;
  18.     private $request;
  19.     /**
  20.      * AuthenticatorSubscriber constructor.
  21.      */
  22.     public function __construct(EntityManagerInterface $managerRequestStack $request)
  23.     {
  24.         $this->manager $manager;
  25.         $this->request $request;
  26.     }
  27.     /** @return array<string> */
  28.     public static function getSubscribedEvents()
  29.     {
  30.         return [
  31.             AuthenticationEvents::AUTHENTICATION_FAILURE        => 'onSecurityAuthenticationFailure',
  32.             AuthenticationEvents::AUTHENTICATION_SUCCESS        => 'onSecurityAuthenticationSuccess',
  33.             SecurityEvents::INTERACTIVE_LOGIN                   => 'onSecurityInteractiveLogin',
  34.             'Symfony\Component\Security\Http\Event\LogoutEvent' => 'onSecurityLogout'
  35.         ];
  36.     }
  37.     public function onSecurityAuthenticationFailure(AuthenticationFailureEvent $event)
  38.     {
  39.         $securityToken $event->getAuthenticationToken();
  40.         $securityTokenException $event->getAuthenticationException();
  41.         //dd($event);
  42.         $messageKey $securityTokenException->getMessageKey();
  43.         ['username' => $username] = $securityToken->getCredentials();
  44.         [
  45.             'user_ip' => $routeIp,
  46.         ] = $this->getRouteNameAndUserIp();
  47.         $log = new Log();
  48.         $log->setLevel(1);
  49.         $log->setTitle("Login error");
  50.         $log->setDescription("L'utilisateur avec le login ".$username." a essayé de se connecter. La raison : ".$messageKey);
  51.         $log->setOthers("Adresse ip : ".$routeIp);
  52.         $this->manager->persist($log);
  53.         $this->manager->flush();
  54.     }
  55.     public function onSecurityAuthenticationSuccess(AuthenticationSuccessEvent $event)
  56.     {
  57.         [
  58.             'route_name' => $routeName,
  59.             'user_ip' => $routeIp,
  60.         ] = $this->getRouteNameAndUserIp();
  61.         if (!empty($event->getAuthenticationToken()->getRoleNames())) {
  62.             //dd($event->getAuthenticationToken()->getRoleNames());
  63.             //dd($routeName);
  64.             if ($routeName == 'app_login') {
  65.                 $user $event->getAuthenticationToken()->getUser();
  66.                 //dd($user);
  67.                 // Create log
  68.                 $log = new Log();
  69.                 $log->setCreatedBy($user);
  70.                 $log->setLevel(1);
  71.                 $log->setTitle("Connexion utilisateur");
  72.                 $log->setDescription("L'utilisateur ".$user->getUsername()." vient de se connecter");
  73.                 $log->setOthers("IP : ".$routeIp);
  74.                 $this->manager->persist($log);
  75.                 $this->manager->flush();
  76.             }
  77.         }
  78.     }
  79.     public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
  80.     {
  81.         //
  82.     }
  83.     public function onSecurityLogout(LogoutEvent $event)
  84.     {
  85.         //dd($event);
  86.         $response $event->getResponse();
  87.         $securityToken $event->getToken();
  88.         if (!$response || !$securityToken) {
  89.             return;
  90.         }
  91.         ['user_ip' => $routeIp] = $this->getRouteNameAndUserIp();
  92.         $user $securityToken->getUser();
  93.         $log = new Log();
  94.         $log->setCreatedBy($user);
  95.         $log->setLevel(1);
  96.         $log->setTitle("Deconnexion utilisateur");
  97.         $log->setDescription("L'utilisateur ".$user->getUsername()." vient de se déconnecter");
  98.         $log->setOthers("IP : ".$routeIp);
  99.         $this->manager->persist($log);
  100.         $this->manager->flush();
  101.     }
  102.     /** @return array{user_ip: string|null, route_name: mixed} */
  103.     private function getRouteNameAndUserIp()
  104.     {
  105.         $request $this->request->getCurrentRequest();
  106.         if (!$request) {
  107.             return [
  108.                 'user_ip' => 'Inconnue',
  109.                 'route_name' => 'Inconnue'
  110.             ];
  111.         }
  112.         return [
  113.             'user_ip' => $request->getClientIp() ? $request->getClientIp() : 'Inconnue',
  114.             'route_name' => $request->attributes->get('_route')
  115.         ];
  116.     }
  117.     private function getUsername(TokenInterface $securityToken) {
  118.         $user $securityToken->getUser();
  119.         return $user->getUsername();
  120.     }
  121. }