src/Controller/SecurityController.php line 22

  1. <?php
  2. namespace App\Controller;
  3. use App\Form\ResetPasswordFormType;
  4. use App\Form\ResetPasswordRequestFormType;
  5. use App\Repository\UsersRepository;
  6. use App\Service\SendMailService;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  14. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  15. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  16. class SecurityController extends AbstractController
  17. {
  18.     #[Route(path: '/login', name: 'app_login')]
  19.     public function login(AuthenticationUtils $authenticationUtils): Response
  20.     {
  21.         /*
  22.         // Pour vérifier si l'utilisateur est connecté et si oui, le rediriger.
  23.         if ($this->getUser()) {
  24.             return $this->redirectToRoute('target_path');
  25.         }
  26.         */
  27.         // get the login error if there is one
  28.         $error = $authenticationUtils->getLastAuthenticationError();
  29.         // last username entered by the user
  30.         $lastUsername = $authenticationUtils->getLastUsername();
  31.         return $this->render('security/login.html.twig', [
  32.             'last_username' => $lastUsername, 
  33.             'error' => $error
  34.         ]);
  35.     }
  36.     #[Route(path: '/logout', name: 'app_logout')]
  37.     public function logout(): void
  38.     {
  39.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  40.     }
  41.     // Récupération de mot de passe
  42.     #[Route('/oubli-pass', name:'forgotten_password')]
  43.     public function forgottenPassword(
  44.         Request $request, 
  45.         UsersRepository $usersRepository, 
  46.         TokenGeneratorInterface $tokenGeneratorInterface,
  47.         EntityManagerInterface $entityManagerInterface,
  48.         SendMailService $mail
  49.         ): Response
  50.     {
  51.         $form = $this->createForm(ResetPasswordRequestFormType::class);
  52.         $form->handleRequest($request);
  53.         if($form->isSubmitted() && $form->isValid()){
  54.             //On va chercher l'utilisateur par son email
  55.             $user = $usersRepository->findOneByEmail($form->get('email')->getData());
  56.             // On vérifie si on a un utilisateur
  57.             if ($user) {
  58.                 // On génère un token de réinitialisation
  59.                 $token = $tokenGeneratorInterface->generateToken();
  60.                 $user->setResetToken($token);
  61.                 $entityManagerInterface->persist($user);
  62.                 $entityManagerInterface->flush();
  63.                 // On génère un lien de réinitialisation du mot de passe
  64.                 $url = $this->generateUrl('reset_pass', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
  65.                 //On crée les données du mail
  66.                 $context = compact('url', 'user');
  67.                 //Envoi du mail
  68.                 $mail->send(
  69.                     'no-reply@e-commerce.fr',
  70.                     $user->getEmail(),
  71.                     'Réinitialisation du mot de passe',
  72.                     'password_reset',
  73.                     $context
  74.                 );
  75.                 $this->addFlash('success', 'Email envoyé avec succès');
  76.                 return $this->redirectToRoute('app_login');
  77.             }
  78.             // $user est null
  79.             $this->addFlash('danger', 'Un problème est survenu');
  80.             return $this->redirectToRoute('app_login');
  81.         }
  82.         return $this->render('security/reset_password_request.html.twig', [
  83.             'requestPassForm' => $form->createView()
  84.         ]);
  85.     }
  86.     #[Route('/oubli-pass/{token}', name:'reset_pass')]
  87.     public function resetPass(
  88.         string $token,
  89.         Request $request,
  90.         UsersRepository $usersRepository,
  91.         EntityManagerInterface $entityManagerInterface,
  92.         UserPasswordHasherInterface $PasswordHasher
  93.     ): Response
  94.     {
  95.         //On vérifie si on a ce token en BDD
  96.         $user = $usersRepository->findOneByResetToken($token);
  97.         
  98.         if ($user) {
  99.             $form = $this->createForm(ResetPasswordFormType::class);
  100.             $form->handleRequest($request);
  101.             if ($form->isSubmitted() && $form->isValid()) {
  102.                 //On efface le token
  103.                 $user->setResetToken('');
  104.                 $user->setPassword(
  105.                     $PasswordHasher->hashPassword(
  106.                         $user,
  107.                         $form->get('password')->getData()
  108.                     )
  109.                 );
  110.                 $entityManagerInterface->persist($user);
  111.                 $entityManagerInterface->flush();
  112.                 $this->addFlash('success', 'Mot de passe changé avec succès');
  113.                 return $this->redirectToRoute('app_login');
  114.             }
  115.             return $this->render('security/reset_password.html.twig', [
  116.                 'passForm' => $form->createView()
  117.             ]);
  118.         }
  119.         $this->addFlash('danger', 'Jeton invalide');
  120.         return $this->redirectToRoute('app_login');
  121.     }
  122. }