src/EventListener/LoginListener.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\Utilisateur;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
  8. use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
  9. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  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. final class LoginListener
  14. {
  15.     /** @var EntityManagerInterface $em */
  16.     private $em;
  17.     /** @var LoggerInterface $logger */
  18.     private $logger;
  19.     /** @var RequestStack $requestStack */
  20.     private $requestStack;
  21.     /** @var int $session */
  22.     private $login_attempts 3;
  23.     /** @var string $session */
  24.     private $jail_duration '15 minutes';
  25.     public function __construct(
  26.         EntityManagerInterface $em,
  27.         LoggerInterface $logger,
  28.         RequestStack $requestStack,
  29.         $login_attempts,
  30.         $jail_duration
  31.     ) {
  32.         $this->em $em;
  33.         $this->logger $logger;
  34.         $this->requestStack $requestStack;
  35.         $this->login_attempts $login_attempts;
  36.         $this->jail_duration $jail_duration;
  37.     }
  38.     public function onInteractiveLogin(InteractiveLoginEvent $event)
  39.     {
  40.         $request $event->getRequest();
  41.         $login $request->request->get('_username');
  42.         $this->logger->info("Connexion : " $login);
  43.     }
  44.     public function onAuthenticationFailure(AuthenticationFailureEvent $event)
  45.     {
  46.         $login $event->getAuthenticationToken()->getUsername();
  47.         $query "
  48.             INSERT INTO login_attempts_errors ( login, date_attempt, ip_attempt, jailed )
  49.             VALUES (
  50.                 '" $login "',
  51.                 now(),
  52.                 '" . @$_SERVER['REMOTE_ADDR'] . "',
  53.                 CASE WHEN (
  54.                         SELECT COUNT(*)
  55.                         FROM login_attempts_errors
  56.                         WHERE login = '" $login "'
  57.                         AND date_attempt >= ( now() - interval '" $this->jail_duration "' )
  58.                     ) >= " $this->login_attempts "
  59.                     THEN true
  60.                     ELSE false
  61.                 END
  62.             )
  63.         ";
  64.         $this->em->getConnection()->executeStatement($query);
  65.         $this->logger->info("Connexion echouĂ©e");
  66.     }
  67.     public function onAuthenticationSuccess(AuthenticationSuccessEvent $event)
  68.     {
  69.         $session $this->requestStack->getSession();
  70.         $token $event->getAuthenticationToken();
  71.         /** @var Utilisateur $user */
  72.         $user $token->getUser();
  73.         $user->setDateConnexion(new \DateTime());
  74.         $this->em->persist($user);
  75.         $this->em->flush();
  76.         $this->logger->info("Connexion reussie");
  77.         // Tokens instances implementing the getFirewallName method
  78.         if (!(
  79.             $token instanceof PreAuthenticatedToken
  80.         ||  $token instanceof RememberMeToken
  81.         ||  $token instanceof UsernamePasswordToken
  82.         )) {
  83.             return;
  84.         }
  85.         if ('factuwall' === $token->getFirewallName()) {
  86.             $session->set('activeStructure'null);
  87.             $session->set('userLevel'null);
  88.             return;
  89.         }
  90.         $qb $this->em->createQueryBuilder();
  91.         $qb->select('s')
  92.             ->from(\App\Entity\UtilisateurStructure::class, 'us')
  93.             ->from(\App\Entity\Structure::class, 's')
  94.             ->andWhere('s.idstructure = us.idstructure')
  95.             ->andWhere("us.idutilisateur = " $user->getId())
  96.             ->orderBy('s.niveau''ASC')
  97.             ->setFirstResult(0)
  98.             ->setMaxResults(1);
  99.         $structure $qb->getQuery()->getResult();
  100.         $session->set('activeStructure'$structure[0] ?? null);
  101.         $qb->select('us');
  102.         $droits $qb->getQuery()->getResult();
  103.         $userLevel 'membre';
  104.         if ($droits[0]->getIssuperv()) {
  105.             $userLevel 'superv';
  106.         }
  107.         if ($droits[0]->getIsadmin()) {
  108.             $userLevel 'admin';
  109.         }
  110.         $session->set('userLevel'$userLevel);
  111.     }
  112. }