<?php
/**
* src/Controller/Security/SecurityController.php
* Contrôleur de sécurité des connexions.
*
* @author Jean-François Brisse <jeff@bvb-software.fr>
* @version 1.0.0
*/
namespace App\Controller\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController {
private $_requestStack;
/**
* Attribution des valeurs par défaut lors de la construction.
*
* @param RequestStack $requestStack Stack de la requête.
*/
public function __construct(
RequestStack $requestStack
) {
$this->_requestStack = $requestStack;
}
/**
* Connexion d'un utilisateur sans passer par le lanceur Java.
*
* @return Response
*/
public function connect(): Response
{
return $this->render('security/connect.html.twig');
}
/**
* Connexion à modifier avec la gestion des utlilisateurs.
*
* @param Request $request Requête HTTP.
* @param AuthenticationUtils $helper Utilitaires d'authentification.
*/
public function connect2FA(
Request $request,
AuthenticationUtils $helper
)
{
// Affichage de la page de login pour les administrateurs.
$codeSoc = $this->getParameter('code_soc');
$appServer = $this->getParameter('app_server');
$safeKey = $this->getParameter('safe_key');
$keyAdmin = ($appServer == "staging") ? $codeSoc . ucfirst($appServer) : $codeSoc;
$cleanEncrypt = str_replace('+', '$', $this->encrypt($keyAdmin . "SuperAdmin" . $safeKey));
if (array_key_exists($cleanEncrypt,$_GET)) {
return $this->render('security/login.html.twig', [
'last_username' => $helper->getLastUsername(),
'error' => $helper->getLastAuthenticationError()
]);
}
// Redirection vers la page de sécurité si les clés secrète et de validation ne sont pas présentes.
if (!array_key_exists("secretKey",$_GET) && !array_key_exists("validator",$_GET)) {
return $this->redirectToRoute('security_login');
}
// Validation des clés secrète et de validation.
try {
$secretKeyGet = str_replace(' ','+',str_replace('~','/',$request->get("secretKey")));
$validatorGet = str_replace(' ','+',str_replace('~','/',$request->get("validator")));
// Initialisation des varaiables de session.
$session = $this->_requestStack->getSession();
$session->set('secretKey', $secretKeyGet);
$session->set('validate', $validatorGet);
// Contrôle de l'accès.
return $this->redirectToRoute('security_check_secret');
// Redirection vers la page de sécurité en cas de problème.
} catch (\Exception $e) {
return $this->redirectToRoute('security_login');
}
}
/**
* Déconnexion d'un utilisateur.
*
* @return Response
*/
public function disconnect(): Response
{
return $this->render('security/logout.html.twig');
}
/**
* Cryptage d'une chaîne de caractère.
*
* @param string $stringToEncrypt La chaîne à crypter.
* @return string La chaîne cryptée.
*/
private function encrypt(
$stringToEncrypt
): string
{
$encMethod = $this->getParameter('bdd_enc_method');
$pubKey = $this->getParameter('bdd_pub_key');
$encryptedString = openssl_encrypt($stringToEncrypt, $encMethod, $pubKey);
return str_replace('=','',$encryptedString);
}
/**
* Connexion d'un utilisateur.
*
* @param AuthenticationUtils $helper Utilitaires d'authentification.
* @return Response
*/
public function login(
AuthenticationUtils $helper
): Response
{
return $this->render('security/login.html.twig', [
'last_username' => $helper->getLastUsername(),
'error' => $helper->getLastAuthenticationError()
]);
}
/**
* Message suite à un problème d'identifiants.
*
* @return Response
*/
public function loginFailure(): Response
{
return $this->render('security/failure.html.twig');
}
/**
* Déconnexion d'un utilisateur.
* Mais celle ci ne doit jamais être executé car symfony l'interceptera avant.
*
* @return void
*/
public function logout(): void
{
throw new \Exception('This should never be reached!');
}
}