src/Controller/SecurityController.php line 46

Open in your IDE?
  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('/connexion'name:'app_login')]
  19.     public function login(AuthenticationUtils $authenticationUtils): Response
  20.     {
  21.         // if ($this->getUser()) {
  22.         //     return $this->redirectToRoute('target_path');
  23.         // }
  24.         // get the login error if there is one
  25.         $error $authenticationUtils->getLastAuthenticationError();
  26.         // last username entered by the user
  27.         $lastUsername $authenticationUtils->getLastUsername();
  28.         return $this->render('security/login.html.twig', [
  29.             'last_username' => $lastUsername,
  30.             'error' => $error
  31.         ]);
  32.     }
  33.     #[Route('/deconnexion'name:'app_logout')]
  34.     public function logout(): void
  35.     {
  36.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  37.     }
  38.     #[Route('/oubli-pass'name:'forgotten_password')]
  39.     public function forgottenPassword(
  40.         Request $request,
  41.         UsersRepository $usersRepository,
  42.         TokenGeneratorInterface $tokenGenerator,
  43.         EntityManagerInterface $entityManager,
  44.         SendMailService $mail
  45.     ): Response
  46.     {
  47.         $form $this->createForm(ResetPasswordRequestFormType::class);
  48.         $form->handleRequest($request);
  49.         if($form->isSubmitted() && $form->isValid()){
  50.             //On va chercher l'utilisateur par son email
  51.             $user $usersRepository->findOneByEmail($form->get('email')->getData());
  52.             // On vérifie si on a un utilisateur
  53.             if($user){
  54.                 // On génère un token de réinitialisation
  55.                 $token $tokenGenerator->generateToken();
  56.                 $user->setResetToken($token);
  57.                 $entityManager->persist($user);
  58.                 $entityManager->flush();
  59.                 // On génère un lien de réinitialisation du mot de passe
  60.                 $url $this->generateUrl('reset_pass', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
  61.                 
  62.                 // On crée les données du mail
  63.                 $context compact('url''user');
  64.                 // Envoi du mail
  65.                 $mail->send(
  66.                     'no-reply@e-commerce.fr',
  67.                     $user->getEmail(),
  68.                     'Réinitialisation de mot de passe',
  69.                     'password_reset',
  70.                     $context
  71.                 );
  72.                 $this->addFlash('success''Email envoyé avec succès');
  73.                 return $this->redirectToRoute('app_login');
  74.             }
  75.             // $user est null
  76.             $this->addFlash('danger''Un problème est survenu');
  77.             return $this->redirectToRoute('app_login');
  78.         }
  79.         return $this->render('security/reset_password_request.html.twig', [
  80.             'requestPassForm' => $form->createView()
  81.         ]);
  82.     }
  83.     #[Route('/oubli-pass/{token}'name:'reset_pass')]
  84.     public function resetPass(
  85.         string $token,
  86.         Request $request,
  87.         UsersRepository $usersRepository,
  88.         EntityManagerInterface $entityManager,
  89.         UserPasswordHasherInterface $passwordHasher
  90.     ): Response
  91.     {
  92.         // On vérifie si on a ce token dans la base
  93.         $user $usersRepository->findOneByResetToken($token);
  94.         
  95.         if($user){
  96.             $form $this->createForm(ResetPasswordFormType::class);
  97.             $form->handleRequest($request);
  98.             if($form->isSubmitted() && $form->isValid()){
  99.                 // On efface le token
  100.                 $user->setResetToken('');
  101.                 $user->setPassword(
  102.                     $passwordHasher->hashPassword(
  103.                         $user,
  104.                         $form->get('password')->getData()
  105.                     )
  106.                 );
  107.                 $entityManager->persist($user);
  108.                 $entityManager->flush();
  109.                 $this->addFlash('success''Mot de passe changé avec succès');
  110.                 return $this->redirectToRoute('app_login');
  111.             }
  112.             return $this->render('security/reset_password.html.twig', [
  113.                 'passForm' => $form->createView()
  114.             ]);
  115.         }
  116.         $this->addFlash('danger''Jeton invalide');
  117.         return $this->redirectToRoute('app_login');
  118.     }
  119. }