src/Controller/SecurityController.php line 54

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTimeImmutable;
  4. use App\Entity\Forgotten;
  5. use App\Form\PasswordType;
  6. use App\Form\ForgottenType;
  7. use App\Services\MailerService;
  8. use App\Repository\UidRepository;
  9. use App\Repository\ForgottenRepository;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  18. class SecurityController extends AbstractController
  19. {
  20.     /**
  21.      * @Route("/login", name="app_login")
  22.      */
  23.     public function login(AuthenticationUtils $authenticationUtils): Response
  24.     {
  25.         if ($this->getUser()) {
  26.             // On redirige l'utilisateur en fonction de son rôle
  27.             $role strtolower(str_replace('ROLE_'''$this->getUser()->getRoles()[0]));
  28.             $route $role '_dashboard';
  29.             return $this->redirectToRoute("dashboard");
  30.         }
  31.         // get the login error if there is one
  32.         $error $authenticationUtils->getLastAuthenticationError();
  33.         // last username entered by the user
  34.         $lastUsername $authenticationUtils->getLastUsername();
  35.         return $this->render('security/login.html.twig', ['current'=> 'login','last_username' => $lastUsername'error' => $error]);
  36.     }
  37.     /**
  38.      * @Route("/logout", name="app_logout")
  39.      */
  40.     public function logout(SessionInterface $session): void
  41.     {
  42.         unset($session);
  43.     }
  44.     /**
  45.      * @Route("/mot-de-passe-oublie", name="app_forgotten")
  46.      */
  47.     public function forgotten(
  48.         Request $request
  49.         UidRepository $uidRepository,
  50.         ForgottenRepository $forgottenRepository,
  51.         TokenGeneratorInterface $tokenGenerator,
  52.         UserPasswordHasherInterface $encoder,
  53.         MailerService $mailer
  54.     ): Response
  55.     {
  56.         $error = [];
  57.         $params = [];
  58.         $lastUsername '';
  59.         /** Confirmation de la demande */
  60.         if ($request->query->get("_t")) {
  61.             $token $request->query->get("_t");
  62.             $forgotten $forgottenRepository->findOneBy(["token" => $token]);
  63.             $form $this->createForm(PasswordType::class)->handleRequest($request);
  64.             /** Demande trouvée */
  65.             if ($forgotten) {
  66.                 if ($form->isSubmitted() && $form->isValid()) {
  67.                     $uid $uidRepository->find($forgotten->getUid());
  68.                     $data $form->getData();
  69.                     $password $data["password"];
  70.                     $uid->setPassword($encoder->hashPassword($uid$password));
  71.                     $uid->setUpdatedAt(new DateTimeImmutable());
  72.                     /** Suppression de la demande de modification */
  73.                     $this->manager->remove($forgotten);
  74.                     $this->manager->flush();
  75.                     $this->addFlash("success""Votre mot de passe à bien été changé. Vous pouvez dès à présent vous connecter.");
  76.                     return $this->redirectToRoute("app_login");
  77.                 }
  78.             }
  79.             else {
  80.                 $this->addFlash("danger""Une erreur est survenue.");
  81.                 return $this->redirectToRoute("app_forgotten");
  82.             }
  83.             return $this->render('security/new_password.html.twig', [
  84.                 'current' => '',
  85.                 'error' => $error,
  86.                 'form' => $form->createView(),
  87.             ]);
  88.             
  89.         }
  90.         else {
  91.             $form $this->createForm(ForgottenType::class)->handleRequest($request);
  92.             if ($form->isSubmitted() && $form->isValid()) {
  93.                 $data $form->getData();
  94.                 $email $data['email'];
  95.                 $lastUsername $email;
  96.     
  97.                 $existUid $uidRepository->findOneBy(["email" => $email]);
  98.                 /** Utilisateur valide */
  99.                 if (null !== $existUid) {
  100.                     
  101.                     $existForgotten $forgottenRepository->findOneBy(['uid' => $existUid]);
  102.                     if(!$existForgotten){
  103.                         $forgotten = new Forgotten();
  104.                         $forgotten->setUid($existUid);
  105.                         $forgotten->setCreatedAt(new DateTimeImmutable());
  106.                         $token $tokenGenerator->generateToken();
  107.                         $forgotten->setToken($token);
  108.                         $this->manager->persist($forgotten);
  109.                         $this->manager->flush();
  110.     
  111.                         $params = [
  112.                             'user' => $existUid,
  113.                             'token' => $forgotten->getToken(),
  114.                         ];
  115.                         $mailer->send("Demande de ré-initialisation de votre mot de passe - LOTICA", [$email], "forgot",$params);
  116.         
  117.                         $this->addFlash("success""Un e-mail avec un lien de ré-initialisation pour votre mot de passe vient de vous être envoyé.");
  118.                         return $this->redirectToRoute("app_forgotten");
  119.                     }
  120.                     else {
  121.                         $this->addFlash("danger""Demande de ré-initialisation déjà enregistrée. Un e-mail avec un lien de confirmation vous à été envoyé.");
  122.                     }
  123.                 }
  124.                 else {
  125.                     $this->addFlash("danger""Adresse e-mail inconnue.");
  126.                 }
  127.             }
  128.             return $this->render('security/forgotten.html.twig', [
  129.                 'current' => '',
  130.                 'lastUsername' => $lastUsername
  131.                 'error' => $error,
  132.                 'form' => $form->createView(),
  133.             ]);
  134.         }
  135.     }
  136. }