src/Controller/SecurityController.php line 215

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. use Symfony\Component\Validator\Validator\ValidatorInterface;       // contrôleur de contraintes
  9. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;   // l'encodeur ofcourse
  10. use App\Service\LOGDEFService;
  11. use App\Entity\usr;
  12. use App\Entity\usl;
  13. class SecurityController extends AbstractController
  14. {
  15.     #[Route(path'/identification'name'identification')]
  16.     public function identification
  17.         (
  18.             ManagerRegistry $doctrine
  19.             AuthenticationUtils $authenticationUtils,
  20.             UserPasswordHasherInterface $passwordHasher,
  21.         ): Response
  22.     {
  23.         
  24.         $em $doctrine->getManager();
  25.         // activer si besoin de coder / définir un pwd pour un glups
  26.         /*
  27.             $usr = $em->getRepository(usr::class)->findOneBy(array('username'=>'stephy.deveaux'));
  28.             $plaintextPassword = 'agagagagag:';
  29.             $hashedPassword = $passwordHasher->hashPassword(
  30.                 $usr,
  31.                 $plaintextPassword
  32.             );
  33.             $usr->setPassword($hashedPassword);
  34.             $em->persist($usr);
  35.             $em->flush();
  36.         */
  37.         // =============== CTRL LOGIN'S =====================
  38.         //var_dump($_SERVER);
  39.         // vérif occurences demandes : combien de fois en combien de temps pour quel login
  40.         $delaymin 1800;    // délai maxi pour une série de tentative de login pour une IP (30')
  41.         $nbtryipmax 16;      // nb tentatives max pour une même IP en moins de 'delaymin'
  42.         $nbtrylogmax 10;      // nb tentatives échouées max pour un login en moins de 'delaymin'
  43.         
  44.         $ip '';
  45.         if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){    // récup IP origine dde
  46.             $ip $_SERVER['HTTP_X_FORWARDED_FOR'];
  47.         }else{
  48.             $ip $_SERVER['REMOTE_ADDR'];
  49.         }
  50.         $datnow time();
  51.         $perioddde date('Y-m-d H:i:s'mktime(date('H'$datnow),date('i'$datnow),date('s'$datnow),date('m'$datnow),date('d'$datnow),date('Y'$datnow)));
  52.         $datlimit $datnow $delaymin;
  53.         $periodlimit date('Y-m-d H:i:s'mktime(date('H'$datlimit),date('i'$datlimit),date('s'$datlimit),date('m'$datlimit),date('d'$datlimit),date('Y'$datlimit)));
  54.         // 1° niveau CTRL : affichage répété page login pour rien  ================================
  55.         $ctx '';$nbtry=0;
  56.         if((isset($_SERVER['HTTP_REFERER'])) && (isset($_SERVER['HTTP_COOKIE']))){ // logout possible, pas de vérif
  57.             $ctx 'logout';
  58.             // dd('http referer isset et cookie');
  59.         }
  60.         
  61.         // nb ddes pour cette IP dans les dernières 'delaymin' secondes avec ou sans login
  62.         if($ctx!='logout'){
  63.             // dd($ctx.', '.$ip);
  64.             $query $em->getRepository(usl::class)->createQueryBuilder('usl')
  65.                 ->select("COUNT(usl.uslip) AS nbtry")
  66.                 ->where('usl.uslip = :uslip')
  67.                 ->setParameter('uslip'$ip)
  68.                 ->andwhere('usl.uslip NOT IN (:iplocale)')
  69.                 // ->setParameter('iplocale' , array('127.0.0.1','192.168.26.50'))     // pour audit cq + locloc
  70.                 ->setParameter('iplocale' , array('127.0.0.1'))     // locloc ou cq
  71.                 ->andwhere('usl.usldat BETWEEN :periodlimit AND :perioddde')
  72.                 ->setParameter('perioddde' ,$perioddde)
  73.                 ->setParameter('periodlimit' ,$periodlimit)
  74.             ;
  75.             $nbtry $query->getQuery()->getSingleScalarResult();
  76.         }
  77.         // 1° blocage : affichage excessif de la page de login pour rien
  78.         if($nbtry>=$nbtryipmax){        // abus
  79.             $this->addFlash('Erreur'"IP Reconnectez-vous dans 1 heure. Tentatives de connexion excessives : ".$nbtryipmax);
  80.             // renvoi page erreur
  81.             return $this->render('security/erreur.html.twig'
  82.                 array(
  83.                     'ip' => $ip
  84.                 )
  85.             );
  86.         }
  87.         
  88.         // 2° niveau CTRL : tentative de login répétée avec échec => error ========================
  89.         // vérif si même IP a tenté de se loguer plus de nbtrylogmax pour un login avec N comptes....
  90.         $query $em->getRepository(USL::class)->createQueryBuilder('usl')
  91.             ->select("COUNT(usl.uslip) AS nbtry")
  92.             ->where('usl.uslctx =:uslctx')
  93.             ->setParameter('uslctx''error')
  94.             ->andwhere('usl.usldat BETWEEN :periodlimit AND :perioddde')
  95.             ->setParameter('perioddde' ,$perioddde)
  96.             ->setParameter('periodlimit' ,$periodlimit)
  97.         ;
  98.         $nbtry $query->getQuery()->getSingleScalarResult();
  99.         if($nbtry>=$nbtrylogmax){        // abus
  100.             $this->addFlash('Erreur'"IP Reconnectez-vous dans 1 heure. Tentatives de connexion excessives : ".$nbtrylogmax);
  101.             // renvoi page erreur
  102.             return $this->render('security/erreur.html.twig'
  103.                 array(
  104.                     'ip' => $ip
  105.                 )
  106.             );
  107.         }else{
  108.             
  109.             // enregistrement des caractéristiques de la demande de login 
  110.             $error $authenticationUtils->getLastAuthenticationError();    // get the login error if there is one
  111.             $lastUsername $authenticationUtils->getLastUsername();        // last username entered by the user
  112.             // possible provenance logout, récup phpsessid pour id usr
  113.             $cook ''
  114.             if(isset($_SERVER['HTTP_REFERER'])){
  115.                 if(isset($_SERVER['HTTP_COOKIE'])){ // id usr possibl
  116.                     $cook str_replace('PHPSESSID=','',$_SERVER['HTTP_COOKIE']);
  117.                     $pos strpos($cook";");
  118.                     if(($pos>1)&&($pos<255)){
  119.                         $cook substr($cook0$pos-1);
  120.                     }else{
  121.                         $cook substr($cook0254);
  122.                     }
  123.                 }
  124.             }
  125.             if($error){                                                // inactive renvoi erreur niveau Render (ci-dessous)
  126.                 $login $lastUsername;
  127.                 $ctx 'error';
  128.                 $this->addFlash('Erreur''Identification invalide');
  129.             }else{
  130.                 if($lastUsername!=''){
  131.                     $login $lastUsername;
  132.                     $ctx 'login';
  133.                     if($cook==''){
  134.                         $ctx 'start';
  135.                     }
  136.                 }else{
  137.                     $login '';
  138.                     if($cook==''){
  139.                         $ctx 'start';
  140.                     }else{
  141.                         $ctx 'logout';
  142.                     }
  143.                 }
  144.             }
  145.             
  146.         
  147.             // enrgt dde : IP + Heure + login (0,1)
  148.             $datdde = new \DateTime();
  149.             $usl = new usl;
  150.             $usl->setUslip($ip);
  151.             $usl->setUsldat($datdde);
  152.             $usl->setUsllogin($login);
  153.             $usl->setUslctx($ctx);
  154.             $usl->setUslcook($cook);
  155.             $em->persist($usl);
  156.             $em->flush();
  157.             // 2° niveau vérif   ================================
  158.             // nb échecs pour ce login dans les dernières 'delaymin' secondes
  159.             $nbtry 0;
  160.             if($login!=''){
  161.                 $query $em->getRepository(USL::class)->createQueryBuilder('usl')
  162.                     ->select("COUNT(usl.uslip) AS nbtry")
  163.                     ->where('usl.usllogin = :usllogin')
  164.                     ->setParameter('usllogin'$login)
  165.                     ->andwhere('usl.uslctx <> :uslctx')
  166.                     ->setParameter('uslctx''error')
  167.                     ->andwhere('usl.usldat BETWEEN :periodlimit AND :perioddde')
  168.                     ->setParameter('perioddde' ,$perioddde)
  169.                     ->setParameter('periodlimit' ,$periodlimit)
  170.                 ;
  171.                 $nbtry $query->getQuery()->getSingleScalarResult();
  172.             }
  173.                     
  174.             if($nbtry>=$nbtrylogmax){
  175.                 $this->addFlash('Erreur'"LOGIN : Reconnectez-vous dans 1 heure, nb tentatives excessives > ".$nbtrylogmax);
  176.                 // renvoi page erreur
  177.                 return $this->render('security/erreur.html.twig'
  178.                     array(
  179.                         'ip' => $ip
  180.                     )
  181.                 );
  182.             }else{
  183.                 
  184.                 // situation normale ras
  185.                 return $this->render('security/login.html.twig', [
  186.                     'last_username' => $lastUsername,
  187.                     'error' => $error,
  188.                     // 'deflog' => $deflog,
  189.                 ]);
  190.             }
  191.         }
  192.     }
  193.     #[Route(path'/login'name'app_login')]
  194.     public function login
  195.         (
  196.             AuthenticationUtils $authenticationUtils,
  197.             LOGDEFService $logdefservice,
  198.         ): Response
  199.     {
  200.         
  201.         // en cas d'erreur, enregistrement des caractéristiques de la demande de login 
  202.         // TODO : tenter de réafficher identification !?
  203.         $error $authenticationUtils->getLastAuthenticationError();    // get the login error if there is one
  204.         $lastUsername $authenticationUtils->getLastUsername();        // last username entered by the user
  205.         // ACCUEIL : possible provenance logout, récup phpsessid pour id usr
  206.         $cook ''
  207.         if(isset($_SERVER['HTTP_REFERER'])){
  208.             if(isset($_SERVER['HTTP_COOKIE'])){ // id usr possibl
  209.                 $cook str_replace('PHPSESSID=','',$_SERVER['HTTP_COOKIE']);
  210.                 $pos strpos($cook";");
  211.                 if(($pos>1)&&($pos<255)){
  212.                     $cook substr($cook0$pos-1);
  213.                 }else{
  214.                     $cook substr($cook0254);
  215.                 }
  216.             }
  217.         }
  218.         if($error){                                                // inactive renvoi erreur niveau Render (ci-dessous)
  219.             $login $lastUsername;
  220.             $ctx 'error';
  221.             $this->addFlash('Erreur''Identification invalide');
  222.         }else{
  223.             if($lastUsername!=''){
  224.                 $login $lastUsername;
  225.                 $ctx 'login';
  226.                 if($cook==''){
  227.                     $ctx 'start';
  228.                 }
  229.             }else{
  230.                 $login '';
  231.                 if($cook==''){
  232.                     $ctx 'start';
  233.                 }else{
  234.                     $ctx 'logout';
  235.                 }
  236.             }
  237.         }
  238.         
  239.         // NOS OUTILS : les infobulles fusion de la page
  240.         $lesdefs = array('ppi','raf','pro','mfp');
  241.         $deflog = array();
  242.         foreach($lesdefs as $ladef){
  243.             $deflog[$ladef] = $logdefservice->get_unedef($ladef); 
  244.         }
  245.         
  246.         return $this->render('security\accueil.html.twig', array(
  247.                 'last_username' => $lastUsername,
  248.                 'deflog' => $deflog,
  249.                 'error' => $error
  250.             )
  251.         ); 
  252.     }
  253.     
  254.     // les cartes à jouer avec les outils financiers
  255.     #[Route(path'/nosoutils'name'nosoutils')]
  256.     public function nosoutils(
  257.             LOGDEFService $logdefservice,
  258.         ): Response
  259.     {
  260.         // a) les infobulles fusion de la page
  261.         // $lesdefs = array('ppi','mod','pro','eau','pfi','lis','mev');
  262.         $lesdefs = array('ppi','raf','pro','mfp');
  263.         $deflog = array();
  264.         foreach($lesdefs as $ladef){
  265.             $deflog[$ladef] = $logdefservice->get_unedef($ladef); 
  266.         }
  267.         
  268.         // situation normale ras
  269.         return $this->render('security/nosoutils.html.twig', [
  270.             'deflog' => $deflog,
  271.         ]);
  272.     }
  273.     #[Route(path'/ruralconsult'name'ruralconsult')]
  274.     public function ruralconsult(): Response
  275.     {
  276.         return $this->render('security\ruralconsult.html.twig', array());        
  277.     }
  278.     #[Route(path'/logout'name'app_logout')]
  279.     public function logout(): void
  280.     {
  281.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  282.     }
  283. }