src/Controller/Security/SecurityController.php line 39

Open in your IDE?
  1. <?php
  2. /**
  3.  * src/Controller/Security/SecurityController.php
  4.  * Contrôleur de sécurité des connexions.
  5.  * 
  6.  * @author Jean-François Brisse <jeff@bvb-software.fr>
  7.  * @version 1.0.0
  8.  */
  9. namespace App\Controller\Security;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  15. class SecurityController extends AbstractController {
  16.     private $_requestStack;
  17.     
  18.     /**
  19.      * Attribution des valeurs par défaut lors de la construction.
  20.      * 
  21.      * @param RequestStack $requestStack Stack de la requête.
  22.      */
  23.     public function __construct(
  24.         RequestStack $requestStack
  25.     ) {
  26.         $this->_requestStack = $requestStack;
  27.     }
  28.     
  29.     
  30.     /**
  31.      * Connexion d'un utilisateur sans passer par le lanceur Java.
  32.      * 
  33.      * @return Response
  34.      */
  35.     public function connect(): Response
  36.     {
  37.         return $this->render('security/connect.html.twig');
  38.     }
  39.     /**
  40.      * Connexion à modifier avec la gestion des utlilisateurs.
  41.      * 
  42.      * @param Request $request Requête HTTP.
  43.      * @param AuthenticationUtils $helper Utilitaires d'authentification.
  44.      */
  45.     public function connect2FA(
  46.         Request $request,
  47.         AuthenticationUtils $helper
  48.     )
  49.     {
  50.         // Affichage de la page de login pour les administrateurs.
  51.         $codeSoc = $this->getParameter('code_soc');
  52.         $appServer = $this->getParameter('app_server');
  53.         $safeKey = $this->getParameter('safe_key');
  54.         $keyAdmin = ($appServer == "staging") ? $codeSoc . ucfirst($appServer) : $codeSoc;
  55.         $cleanEncrypt = str_replace('+', '$', $this->encrypt($keyAdmin . "SuperAdmin" . $safeKey));
  56.         
  57.         if (array_key_exists($cleanEncrypt,$_GET)) {
  58.             return $this->render('security/login.html.twig', [
  59.                 'last_username' => $helper->getLastUsername(),
  60.                 'error' => $helper->getLastAuthenticationError()
  61.             ]);
  62.         }
  63.         // Redirection vers la page de sécurité si les clés secrète et de validation ne sont pas présentes.
  64.         if (!array_key_exists("secretKey",$_GET) && !array_key_exists("validator",$_GET)) {
  65.             return $this->redirectToRoute('security_login');
  66.         }
  67.         // Validation des clés secrète et de validation.
  68.         try {
  69.             $secretKeyGet = str_replace(' ','+',str_replace('~','/',$request->get("secretKey")));
  70.             $validatorGet =  str_replace(' ','+',str_replace('~','/',$request->get("validator")));
  71.             // Initialisation des varaiables de session.
  72.             $session = $this->_requestStack->getSession();
  73.             $session->set('secretKey', $secretKeyGet);
  74.             $session->set('validate', $validatorGet);
  75.             
  76.             // Contrôle de l'accès.
  77.             return $this->redirectToRoute('security_check_secret');
  78.         // Redirection vers la page de sécurité en cas de problème.
  79.         } catch (\Exception $e) {
  80.             return $this->redirectToRoute('security_login');
  81.         }
  82.     }
  83.     /**
  84.      * Déconnexion d'un utilisateur.
  85.      * 
  86.      * @return Response
  87.      */
  88.     public function disconnect(): Response
  89.     {
  90.         return $this->render('security/logout.html.twig');
  91.     }
  92.     /**
  93.      * Cryptage d'une chaîne de caractère.
  94.      *
  95.      * @param string $stringToEncrypt La chaîne à crypter.
  96.      * @return string La chaîne cryptée.
  97.      */
  98.     private function encrypt(
  99.         $stringToEncrypt
  100.     ): string
  101.     {
  102.         $encMethod = $this->getParameter('bdd_enc_method');
  103.         $pubKey = $this->getParameter('bdd_pub_key');
  104.         
  105.         $encryptedString = openssl_encrypt($stringToEncrypt, $encMethod, $pubKey);
  106.         return str_replace('=','',$encryptedString);
  107.     }
  108.     /**
  109.      * Connexion d'un utilisateur.
  110.      * 
  111.      * @param AuthenticationUtils $helper Utilitaires d'authentification.
  112.      * @return Response
  113.      */
  114.     public function login(
  115.         AuthenticationUtils $helper
  116.     ): Response
  117.     {
  118.         return $this->render('security/login.html.twig', [
  119.             'last_username' => $helper->getLastUsername(),
  120.             'error' => $helper->getLastAuthenticationError()
  121.         ]);
  122.     }
  123.     /**
  124.      * Message suite à un problème d'identifiants.
  125.      * 
  126.      * @return Response
  127.      */
  128.     public function loginFailure(): Response
  129.     {
  130.         return $this->render('security/failure.html.twig');
  131.     }
  132.     /**
  133.      * Déconnexion d'un utilisateur.
  134.      * Mais celle ci ne doit jamais être executé car symfony l'interceptera avant.
  135.      * 
  136.      * @return void
  137.      */
  138.     public function logout(): void
  139.     {
  140.         throw new \Exception('This should never be reached!');
  141.     }
  142. }