src/Controller/AuthenticationController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use App\Entity\User;
  8. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  9. use Symfony\Component\Validator\Constraints\Email;
  10. use Symfony\Component\Validator\Constraints\NotBlank;
  11. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  12. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  13. use App\Form\ResettingType;
  14. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  15. class AuthenticationController extends AbstractController
  16. {
  17. /**
  18.      * @Route(
  19.      *     "{_locale}/requete",
  20.      *     name="request_resetting",
  21.      *     requirements={
  22.      *         "_locale": "%app_locales%",
  23.      *     }
  24.      * )
  25.      */
  26.     public function request(Request $requestTokenGeneratorInterface $tokenGenerator, \Swift_Mailer $mailer)
  27.     {
  28.         // création d'un formulaire "à la volée", afin que l'internaute puisse renseigner son mail
  29.         $form $this->createFormBuilder()
  30.             ->add('email'EmailType::class, [
  31.                 'constraints' => [
  32.                     new Email(),
  33.                     new NotBlank()
  34.                 ]
  35.             ])
  36.             ->getForm();
  37.         $form->handleRequest($request);
  38.         if ($form->isSubmitted() && $form->isValid()) {
  39.             $em $this->getDoctrine()->getManager();
  40.             // voir l'épisode 2 de cette série pour retrouver la méthode loadUserByUsername:
  41.             $user $em->getRepository(User::class)->loadUserByUsername($form->getData()['email']);
  42.             // aucun email associé à ce compte.
  43.             if (!$user) {
  44.                 $request->getSession()->getFlashBag()->add('warning'"Cet email n'existe pas.");
  45.                 return $this->redirectToRoute("request_resetting");
  46.             }
  47.             // création du token
  48.             $user->setToken($tokenGenerator->generateToken());
  49.             // enregistrement de la date de création du token
  50.             $user->setPasswordRequestedAt(new \Datetime());
  51.             $em->flush();
  52.             // on utilise le service Mailer créé précédemment
  53.             $message = (new \Swift_Message('Renouvellement du mot de passe'))
  54.                 ->setFrom('info@aperosparfumes.com')
  55.                 ->setTo($user->getEmail())
  56.                 ->setBody(
  57.                     $this->renderView(
  58.                     // templates/emails/registration.html.twig
  59.                         'resetting/mail.html.twig',
  60.                         ['user' => $user]
  61.                     ),
  62.                     'text/html'
  63.                 );
  64.             $mailer->send($message);
  65.             $request->getSession()->getFlashBag()->add('success'"Un mail va vous être envoyé afin que vous puissiez renouveller votre mot de passe. Le lien que vous recevrez sera valide 24h.");
  66.             return $this->redirectToRoute("home");
  67.         }
  68.         return $this->render('resetting/request.html.twig', [
  69.             'form' => $form->createView()
  70.         ]);
  71.     }
  72.     // si supérieur à 1 jour, retourne false
  73.     // sinon retourne false
  74.     private function isRequestInTime(\Datetime $passwordRequestedAt null)
  75.     {
  76.         if ($passwordRequestedAt === null)
  77.         {
  78.             return false;
  79.         }
  80.         $now = new \DateTime();
  81.         $interval $now->getTimestamp() - $passwordRequestedAt->getTimestamp();
  82.         $daySeconds 60 60 24;
  83.         $response $interval $daySeconds false $reponse true;
  84.         return $response;
  85.     }
  86.     /**
  87.      * @Route(
  88.      *     "{_locale}/reset/{token}",
  89.      *     name="resetting",
  90.      *     requirements={
  91.      *         "_locale": "%app_locales%",
  92.      *     }
  93.      * )
  94.      */
  95.     public function resetting($tokenRequest $requestUserPasswordEncoderInterface $encoder)
  96.     {
  97.         $id $request->get('id');
  98.         $user $this->getDoctrine()->getManager()->getRepository(User::class)->find($id);
  99.         // interdit l'accès à la page si:
  100.         // le token associé au membre est null
  101.         // le token enregistré en base et le token présent dans l'url ne sont pas égaux
  102.         // le token date de plus de 10 minutes
  103.         if ($user->getToken() === null || $token !== $user->getToken() || !$this->isRequestInTime($user->getPasswordRequestedAt()))
  104.         {
  105.             throw new AccessDeniedHttpException();
  106.         }
  107.         $form $this->createForm(ResettingType::class, $user);
  108.         $form->handleRequest($request);
  109.         if($form->isSubmitted() && $form->isValid())
  110.         {
  111.             $password $encoder->encodePassword($user$user->getPlainPassword());
  112.             $user->setPassword($password);
  113.             // réinitialisation du token à null pour qu'il ne soit plus réutilisable
  114.             $user->setToken(null);
  115.             $user->setPasswordRequestedAt(null);
  116.             $em $this->getDoctrine()->getManager();
  117.             $em->persist($user);
  118.             $em->flush();
  119.             $this->addFlash('success'"Votre mot de passe a été renouvelé.");
  120.             return $this->redirectToRoute('home');
  121.         }
  122.         return $this->render('resetting/index.html.twig', [
  123.             'form' => $form->createView()
  124.         ]);
  125.     }
  126. }