src/Controller/SecurityController.php line 67

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\TokenUser;
  4. use App\Entity\User;
  5. use App\Form\ConfirmRecuperatePasswordType;
  6. use App\Form\LoginType;
  7. use App\Form\RecuperatePasswordType;
  8. use App\Services\EmailSender;
  9. use DateTime;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  19. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  20. use Symfony\Contracts\Translation\TranslatorInterface;
  21. class SecurityController extends AbstractController
  22. {
  23.     /**
  24.      * @param AuthenticationUtils $authenticationUtils
  25.      * @return Response
  26.      * @Route("/login", name="login")
  27.      */
  28.     public function index(AuthenticationUtils $authenticationUtils): Response
  29.     {
  30.         // get the login error if there is one
  31.         $error $authenticationUtils->getLastAuthenticationError();
  32.         // last username entered by the user
  33.         $lastUsername $authenticationUtils->getLastUsername();
  34.         $form $this->createForm(LoginType::class, null, [
  35.             'lastUsername' => $lastUsername,
  36.         ]);
  37.         return $this->render('security/login.html.twig', [
  38.             'last_username' => $lastUsername,
  39.             'error'         => $error,
  40.             'form' => $form->createView()
  41.         ]);
  42.     }
  43.     /**
  44.      * @Route("/logout", name="app_logout")
  45.      */
  46.     public function logout(): void
  47.     {
  48.     }
  49.     /**
  50.      * @Route("/recuperate-password", name="forgot")
  51.      *
  52.      * @param Request $request
  53.      * @param EntityManagerInterface $em
  54.      * @param TranslatorInterface $translator
  55.      * @param EmailSender $mailer
  56.      * @return Response
  57.      * @throws TransportExceptionInterface
  58.      */
  59.     public function recuperatePassword(Request $requestEntityManagerInterface $emTranslatorInterface $translatorEmailSender $mailer): Response
  60.     {
  61.         $form $this->createForm(RecuperatePasswordType::class);
  62.         $form->handleRequest($request);
  63.         $success $request->get('success');
  64.         if ($form->isSubmitted() and $form->isValid()) {
  65.             //get user by email
  66.             $user $em->getRepository(User::class)->findOneBy(['email' => $form->getData()['email']]);
  67.             if(!$user){
  68.                 $this->addFlash(
  69.                     'success',
  70.                     $translator->trans('security.no_user')
  71.                 );
  72.                 return $this->render('security/recuperate_password.html.twig', [
  73.                     'form' => $form->createView(),
  74.                     'title' => $translator->trans('security.recuperate_password'),
  75.                     // 'success' => true
  76.                 ]);
  77.             }
  78.             //create Token
  79.             $token = new TokenUser();
  80.             $token->setType(TokenUser::TOKEN_RECUPERATE_PASSWORD);
  81.             $user->addToken($token);
  82.             $em->persist($token);
  83.             $em->flush();
  84.             $data = [
  85.                 'path' => $this->generateUrl('confirm_recuperate_password', [
  86.                     'token' => $token->getToken(),
  87.                 ], UrlGeneratorInterface::ABSOLUTE_URL),
  88.             ];
  89.             //send email
  90.             $mailer->sendEmail(
  91.                 'mails/recuperate_password.html.twig',
  92.                 $translator->trans('general.app_name'),
  93.                 $user->getEmail(),
  94.                 null,
  95.                 null,
  96.                 $data
  97.             );
  98.             //Add flash success
  99.             $this->addFlash(
  100.                 'success',
  101.                 $translator->trans('security.recuperate_password_success')
  102.             );
  103.         }
  104.         return $this->render('security/recuperate_password.html.twig', [
  105.             'form' => $form->createView(),
  106.             'title' => $translator->trans('security.recuperate_password'),
  107.            // 'success' => true
  108.         ]);
  109.     }
  110.     /**
  111.      * @Route("/confirm/recuperate-password/{token}/{_locale}", name="confirm_recuperate_password")
  112.      *
  113.      * @param Request $request
  114.      * @param $token
  115.      * @param UserPasswordHasherInterface $encoder
  116.      * @param EntityManagerInterface $em
  117.      * @return RedirectResponse|Response
  118.      */
  119.     public function confirmRecuperatePassword(
  120.         Request $request,
  121.         $token,
  122.         UserPasswordHasherInterface $encoder,
  123.         EntityManagerInterface $em
  124.     ): RedirectResponse|Response
  125.     {
  126.         $tokenUser $em->getRepository(TokenUser::class)->findOneBy([
  127.             'token' => $token,
  128.         ]);
  129.         $now = new DateTime();
  130.         if (!$tokenUser->getEnabled() or
  131.             $now >= $tokenUser->getExpiredAt() or
  132.             TokenUser::TOKEN_RECUPERATE_PASSWORD !== $tokenUser->getType()) {
  133.             return $this->redirectToRoute('forgot');
  134.         }
  135.         $form $this->createForm(ConfirmRecuperatePasswordType::class);
  136.         $form->handleRequest($request);
  137.         if ($form->isSubmitted() and $form->isValid()) {
  138.             //Disabled token
  139.             $tokenUser->setEnabled(false);
  140.             //get user from token
  141.             $user $tokenUser->getUser();
  142.             $user->setPassword($encoder->hashPassword($user$form->getData()['password']));
  143.             $em->persist($tokenUser);
  144.             $em->persist($user);
  145.             $em->flush();
  146.             return $this->render('security/confirm_recuperate_password.html.twig', [
  147.                 'form' => $form->createView(),
  148.                 'success' => true
  149.             ]);
  150.         }
  151.         return $this->render('security/confirm_recuperate_password.html.twig', [
  152.             'form' => $form->createView()
  153.         ]);
  154.     }
  155. }