src/Controller/SecurityController.php line 63

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