<?php
namespace App\Controller\Commun;
use App\Entity\AssistantMaternel\AssistantMaternel;
use App\Entity\Parametrage\EnumParametre;
use App\Security\JwtTokenUtils;
use App\Service\Parametrage\ParametrageService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class ConnexionController extends AbstractController
{
private $parametrageService;
public function __construct(ParametrageService $parametrageService)
{
$this->parametrageService = $parametrageService;
}
/**
* @Route("/connexion", name="connexion")
*/
public function connexion(AuthenticationUtils $helper): Response {
if ($this->getUser())
{
return $this->redirectToRoute('index_back_office');
}
return $this->render('commun/connexion.html.twig', [
// dernier username saisi (si il y en a un)
'last_username' => $helper->getLastUsername(),
// La derniere erreur de connexion (si il y en a une)
'error' => $helper->getLastAuthenticationError(),
]);
}
/**
* La route pour se deconnecter.
*
* Mais celle ci ne doit jamais être executé car symfony l'interceptera avant.
*
* @Route("/deconnexion", name="deconnexion")
*/
public function logout(): void {
throw new \Exception(
'Le code de ce controller ne devrait jamais être atteint car'
. 'le composant Security Symfony doit l\'intercepter');
}
/**
* Point d'entrée pour la connexion SSO de Solis vers le GDA
*
* @Route("/sso", name="sso")
*/
public function redirectionSso(Request $request)
{
// Retrouver l'id fonctionnel assmat passé dans le JWT
$jwtToken = JwtTokenUtils::getTokenFromRequest($request);
$idFonctionnelAssmat = JwtTokenUtils::getIdAssmatFromToken($jwtToken);
// Trouver l'assmat correspondant
$repo = $this->getDoctrine()->getManager()->getRepository(AssistantMaternel::class);
$assmat = $repo->findOneBy(['id_fonctionnel' => $idFonctionnelAssmat]);
// Renvoyer une 404 si pas d'assmat
if (!$assmat) {
throw new NotFoundHttpException("Le numéro de dossier $idFonctionnelAssmat est introuvable.");
}
// Rediriger vers la fiche de l'assmat
return new RedirectResponse($this->generateUrl('fiche_assmat', ['id' => $assmat->getId()]));
}
/**
* Point de sortie (?) pour la connexion SSO du GDA PHP vers l'admin assmat Legacy
*
* @Route("/sso-offre-accueil", name="sso_legacy")
*/
public function authentifierLegacy(ParametrageService $parametrageService)
{
// Gestion des erreurs
$user = $this->getUser();
if (!$user->estAssistantMaternel() || !$user->getAssistantMaternel()) {
throw $this->createAccessDeniedException("Cette fonctionnalité est uniquement disponible pour les assistants maternels");
}
// Récupération de la configuration
// FIXME à variabiliser (params BDD ou config .yml ?)
$secret = "LeBonRoiDagobertAMisSaCulotteAL'Envers";
$algo = 'HS256';
$urlRedirection = $parametrageService->getParametre(EnumParametre::URL_ADMIN_AM_LEGACY)->getValeur();
if (!$urlRedirection){
throw new \Exception("URL Admin assmat non configurée");
}
// Création du jeton d'authentification JWT
$jwt = JwtTokenUtils::createTokenForAssmat($user->getAssistantMaternel(), $algo, $secret);
// Redirection vers le site Legacy avec le jeton d'authentification
return $this->redirect("$urlRedirection?jwt=$jwt");
}
}