src/Controller/SecurityController.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Logs;
  4. use App\Entity\User;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  10. use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
  11. class SecurityController extends AbstractController
  12. {
  13.     #[Route('/security'name'security')]
  14.     public function index(): Response
  15.     {
  16.         return $this->render('security/login.html.twig', [
  17.             'controller_name' => 'SecurityController',
  18.         ]);
  19.     }
  20.     #[Route("/login"name"app_login")]
  21.     public function login(ManagerRegistry $managerAuthenticationUtils $authenticationUtils): Response
  22.     {
  23.         
  24.         // Si on choisi l'anglais, le cookie est mis à jour et on recharge la page
  25.         if (isset($_GET['lang'])) {
  26.             if ( $_GET['lang'] == 'eng') {
  27.                 setcookie("lang",'eng',time()+60*60*24*7"/");
  28.                 return  $this->redirectToRoute('app_login');
  29.             }
  30.         }
  31.         // Idem si on passe en Français
  32.         if (!isset($_COOKIE['lang']) || ($_COOKIE['lang'] != 'fra' && $_COOKIE['lang'] != 'eng')) {
  33.             setcookie("lang",'fra',time()+60*60*24*7"/");
  34.             return  $this->redirectToRoute('app_login');
  35.         }
  36.         $entityManager $manager->getManager();
  37.         $logsRepository $entityManager->getRepository(Logs::class);
  38.         $user $this->getUser();
  39.         $lang $_COOKIE['lang'];
  40.         // Un fois connecté
  41.         if ($user != null) {
  42.             if ($this->isGranted('ROLE_ADMIN') == false) {
  43.                 // On cherche s'il existe déjà des logs pour l'utilisateur
  44.                 $logs $user->getLogs();
  45.                 
  46.                 // S'il n'y en a pas, on le crée pour la série 1
  47.                 if (!isset($logs) || $logs == [] || $logs[0] == "") {
  48.                     $lastLog = new Logs;
  49.                     $lastLog->setUser($user);
  50.                     $lastLog->setSerieId(1);
  51.                 // S'il y en a, on cherche s'il y en a un correspondant à la série actuelle de l'utilisateur
  52.                 } else {
  53.                     foreach ($logs as $row) {
  54.                         if ($row->getSerieId() == $user->getCurrentSerie()) {
  55.                             $lastLog $row;
  56.                         }
  57.                     }
  58.                     $lastLog $logsRepository->find($lastLog->getid());
  59.                 }
  60.                 // On rajoute une entrée dans la colonne connexion IP du tableau
  61.                 $lastLog->connectionLogs();
  62.                 
  63.                 $entityManager->persist($lastLog);
  64.                 // On met a jour la BDD utilisateur (derniere connexion et derniere action)
  65.                 $user->setLastLogin(date("y-m-d H:i:s"));
  66.                 $user->setLastAction("co_" date("y-m-d H:i:s"));
  67.                 // On ne garde que les 20 dernière adresse IP afin d'éviter des erreur de nombre de caractere trop important dans la BDD
  68.                 $IPs explode("|"$user->getIpAddress());
  69.                 if (count($IPs) >= 20) {
  70.                     $IPs array_splice($IPs,0,1);
  71.                 }
  72.                 array_push($IPs$this->getIp());
  73.                 $user->setIpAddress(implode("|",$IPs));
  74.                 $entityManager->persist($user);
  75.                 $entityManager->flush();
  76.                 
  77.         }
  78.             // Si c'est un admin qui se connecte, on va directement au backOffice des Utilisateurs
  79.             if ( $this->isGranted("ROLE_ADMIN")) {
  80.             
  81.                 return $this->redirectToRoute('user_backoffice');
  82.             }
  83.             // Si c'est un utilisateur
  84.             if ($user->getRoles() == ["ROLE_USER"]) {
  85.                 // Et que ce n'est NI aussi un admin NI visualiser NI qqun ayant fini sa saisie
  86.                 if ((array_search("ROLE_ADMIN"$user->getRoles()) == false && $user->getUsername() != 'visualiser') && $user->getCurrentSerie() == 11) {
  87.                     // On force la déconnexion avec un message d'erreur
  88.                     session_destroy();
  89.                     $errorPerso "Identifiants déjà utilisés";
  90.                     if ($lang == "eng"$errorPerso "Login no longer available";
  91.                     // On retourne sur l'écran de login
  92.                     return $this->render('security/login.html.twig', [
  93.                         'errorPerso' => $errorPerso,
  94.                         'error' =>  $authenticationUtils->getLastAuthenticationError(),
  95.                         'lang' => $lang,
  96.                     ]);
  97.                 }
  98.                 // Sinon, si l'utilisateur n'a pas rempli ses infos (phrase + sexe + age) on l'envoie sur la page où il le fera, sinon en l'envoie sur le questionnaire
  99.                 if ( $user->getInfos() !== null ) {
  100.                     return $this->redirectToRoute('questionnaire');
  101.                 }
  102.                 return $this->redirectToRoute('introduction');
  103.             }
  104.         }
  105.         // get the login error if there is one
  106.         $error $authenticationUtils->getLastAuthenticationError();
  107.         // last username entered by the user
  108.         $lastUsername $authenticationUtils->getLastUsername();
  109.         $session = [];
  110.         if (isset($_SESSION)) {
  111.             $session $_SESSION;
  112.         }
  113.         return $this->render('security/login.html.twig', [
  114.             'last_username' => $lastUsername,
  115.             'error' => $error,
  116.             'errorPerso' => null,
  117.             'session' => $session,
  118.             'lang' => $lang,
  119.             'table' => "login",
  120.         ]);
  121.     }
  122.     // Cette fonction sert à enregistrer les log de déconnexion si on se déconnecte avec le bouton
  123.     #[Route("/tologout"name"to_logout")]
  124.     public function toLogout(ManagerRegistry $manager): Response
  125.     {
  126.         $entityManager $manager->getManager();
  127.         $logsRepository $entityManager->getRepository(Logs::class);
  128.         $userRepository $entityManager->getRepository(User::class);
  129.         $user $this->getUser();
  130.         if (isset($user) && $this->isGranted('ROLE_ADMIN') == false) {
  131.             // On cherche les Logs de l'utilisateur
  132.             $logs $user->getLogs();
  133.             
  134.             // On récupere le log de la série actuelle de l'utilisateur
  135.             foreach ($logs as $row) {
  136.                 if ($row->getSerieId() == $user->getCurrentSerie()) {
  137.                     $lastLog $row;
  138.                 }
  139.             }
  140.         
  141.             $lastLog $logsRepository->find($lastLog->getid());
  142.             
  143.             // Toute la suite est pour enregistrer ladite déconnexion en BDD
  144.             $deco explode("|"$lastLog->getDeconnexion());
  145.             
  146.             // On ne garde que les 20 dernières déconnexion pour éviter des erreurs en BDD
  147.             if (count($deco) >= 20) {
  148.                 $deco array_splice($deco,0,1);
  149.             }
  150.             array_push($decodate("y-m-d H:i:s"));
  151.             
  152.             if ($deco == null || $deco[0] == "") {$deco[0] = date("y-m-d H:i:s");}
  153.             $user->setLastAction("deco_" date("y-m-d H:i:s"));
  154.             $lastLog->setDeconnexion(implode("|"$deco));
  155.             $lastLog->setConnexionIp($lastLog->getConnexionIp() . ($lastLog->getConnexionIp()==null?"":"|") . "deco_" date("y-m-d H:i:s"));
  156.             $entityManager->persist($lastLog);
  157.             $entityManager->persist($user);
  158.             $entityManager->flush();
  159.         }
  160.         // Puis on envoie vers la fonction qui déconnecte réellement
  161.         return $this->redirectToRoute('app_logout');
  162.     }
  163.     // La fonction qui déconnecte réallement
  164.     #[Route("/logout"name"app_logout")]
  165.     public function logout(): void
  166.     {
  167.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  168.     }
  169.     protected function getIp() {
  170.     //whether ip is from the share internet  
  171.     if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  172.         $ip $_SERVER['HTTP_CLIENT_IP'];
  173.     }
  174.     //whether ip is from the proxy  
  175.     elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  176.         $ip $_SERVER['HTTP_X_FORWARDED_FOR'];
  177.     }
  178.     //whether ip is from the remote address  
  179.     else {
  180.         $ip $_SERVER['REMOTE_ADDR'];
  181.     }
  182.     return $ip;
  183.     }
  184. }