<?php
namespace App\Controller;
use App\Repository\UserPlatformRepository;
use App\Service\MailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
/**
* @Route("/login/{type}", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils, string $type = null): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
if ($type == "admin") {
return $this->render('backView/security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
} else {
return $this->render('frontView/security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
#[Route('/forgot-password', name: 'app_forgot_password')]
public function forgotPassword(Request $request, UserPlatformRepository $userRepository, MailService $mailService, EntityManagerInterface $em, SessionInterface $session): Response
{
if ($request->isMethod('POST')) {
$email = $request->request->get('email');
$user = $userRepository->findOneBy(['email' => $email]);
if ($user) {
// Génère un token unique pour la réinitialisation
$resetToken = bin2hex(random_bytes(32));
$user->setResetToken($resetToken);
$user->setTokenExpiration(new \DateTime('+1 hour')); // Le token expire dans 1 heure
// Save the user with EntityManager
$em->persist($user);
$em->flush();
// Envoie l'e-mail de réinitialisation
$resetUrl = $this->generateUrl('app_reset_password', ['token' => $resetToken], UrlGeneratorInterface::ABSOLUTE_URL);
$mailService->sendEmail(
['to' => $email],
'Réinitialisation de votre mot de passe',
'frontView/security/emails_forgot_password.html.twig',
['resetUrl' => $resetUrl]
);
$this->addFlash('success', 'Un e-mail de réinitialisation a été envoyé à ' . $email);
} else {
$this->addFlash('error', 'Aucun utilisateur trouvé pour cet e-mail.');
}
}
return $this->render('frontView/security/forgotMdp.html.twig', []);
}
#[Route('/reset-password/{token}', name: 'app_reset_password')]
public function resetPassword(string $token, Request $request, UserPlatformRepository $userRepository, UserPasswordEncoderInterface $passwordEncoder, SessionInterface $session, EntityManagerInterface $em): Response
{
$user = $userRepository->findOneBy(['resetToken' => $token]);
if (!$user || $user->getTokenExpiration() < new \DateTime()) {
$this->addFlash('error', 'Le lien de réinitialisation est invalide ou expiré.');
return $this->redirectToRoute('app_forgot_password');
}
if ($request->isMethod('POST')) {
if ($request->request->get('confirm-password') == $request->request->get('password')) {
$newPassword = $request->request->get('password');
$user->setPassword($passwordEncoder->encodePassword($user, $newPassword));
$user->setResetToken(null); // Supprime le token pour plus de sécurité
$user->setTokenExpiration(null);
$em->persist($user);
$em->flush();
$this->addFlash('success', 'Votre mot de passe a été réinitialisé avec succès.');
return $this->redirectToRoute('app_login');
} else {
$this->addFlash('error', 'Mot de passe different.');
return $this->redirectToRoute('app_reset_password', ['token' => $token]);
}
}
return $this->render('frontView/security/resetMdp.html.twig', [
'token' => $token
]);
}
}