src/Controller/SecurityController.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Form\NewPasswordFormType;
  5. use App\Form\RegistrationFormType;
  6. use App\Form\ResetPassType;
  7. use App\Repository\UserRepository;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  14. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  15. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  16. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class SecurityController extends AbstractController
  19. {
  20.     /**
  21.      * @param AuthenticationUtils $authenticationUtils
  22.      * @Route("/login", name="app_login")
  23.      * @return Response
  24.      */
  25.     public function login(AuthenticationUtils $authenticationUtils): Response
  26.     {
  27.         if ($this->getUser()) {
  28.             return $this->redirectToRoute('app_home');
  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.         $registrationForm $this->createForm(
  35.             RegistrationFormType::class,
  36.             new User(),
  37.             ['action' => $this->generateUrl('app_register')] );
  38.         $forgottenPasswordForm $this->createForm(
  39.             ResetPassType::class,
  40.             null,
  41.             ['action' => $this->generateUrl('app_forgotten_password')]
  42.         );
  43.         return $this->render('security/login.html.twig', [
  44.             'registrationForm' => $registrationForm->createView(),
  45.             'forgottenPasswordForm' => $forgottenPasswordForm->createView(),
  46.             'last_username' => $lastUsername,
  47.             'error' => $error
  48.         ]);
  49.     }
  50.     /**
  51.      * @Route("/logout", name="app_logout")
  52.      * @Security("is_granted('ROLE_USER')")
  53.      */
  54.     public function logout()
  55.     {
  56.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  57.     }
  58.     /**
  59.      * @param Request $request
  60.      * @param UserRepository $userRepository
  61.      * @param \Swift_Mailer $mailer
  62.      * @param TokenGeneratorInterface $tokenGenerator
  63.      * @param TranslatorInterface $translator
  64.      * @Route("/forgotPass", name="app_forgotten_password", methods={"POST"})
  65.      * @return Response
  66.      */
  67.     public function forgotPass(Request $requestUserRepository $userRepository, \Swift_Mailer $mailer,
  68.                                TokenGeneratorInterface $tokenGenerator,TranslatorInterface $translator): Response
  69.     {
  70.         $form $this->createForm(ResetPassType::class);
  71.         $form->handleRequest($request);
  72.         $locale $request->getLocale();
  73.         if ($form->isSubmitted() && $form->isValid()) {
  74.             try {
  75.                 $data $form->getData();
  76.                 // Get User
  77.                 $user $userRepository->findOneBy(['email' => $data['email']]);
  78.                 if ($user === null) {
  79.                     $this->addFlash('danger'$translator->trans('error.accountNotExist',[],null,$request->getLocale()));
  80.                     return $this->redirectToRoute('app_login',['_locale'=>$locale]);
  81.                 }
  82.                 // Generate Token
  83.                 $token $tokenGenerator->generateToken();
  84.                 $user->setResetToken($token);
  85.                 $userRepository->save($user);
  86.             } catch (\Throwable $throwable) {
  87.                 $this->addFlash('warning'$translator->trans('error.error500',[],null,$request->getLocale()));
  88.                 return $this->redirectToRoute('app_login');
  89.             }
  90.             $locale $user->getLocale();
  91.             $url $this->generateUrl('app_reset_password', ['_locale' => $locale,'token' => $token],
  92.                 UrlGeneratorInterface::ABSOLUTE_URL);
  93.             $message = (new \Swift_Message($translator->trans('email.suject',[],null,$locale)))
  94.                 ->setFrom(['no-reply@ed-pepper.eu' => 'Pepper'])
  95.                 ->setTo($user->getEmail())
  96.                 ->setBody(
  97.                     $this->renderView(
  98.                         'emails/reset-password.html.twig',
  99.                         [
  100.                             'suject'=>$translator->trans('email.suject',[],null,$locale),
  101.                             'hello'=> $translator->trans('email.hello',[],null,$locale),
  102.                             'user' => sprintf('%s.%s',$user->getCivility(),$user->getFirstName()),
  103.                             'message'=>$translator->trans('email.message', [], null$locale),
  104.                             'url'=>$url,
  105.                             'footer1' => $translator->trans('email.footer1',[],null,$locale),
  106.                             'footer2' => $translator->trans('email.footer2',[],null,$locale)
  107.                         ]
  108.                     ),
  109.                     'text/html'
  110.                 )
  111.             ;
  112.             // Send email
  113.             $mailer->send($message);
  114.             $this->addFlash('success'$translator->trans('login.forgot.success',["%email%" => $user->getEmail() ],null,$locale));
  115.         }
  116.         return $this->redirectToRoute('app_login',[ '_locale' => $locale]);
  117.     }
  118.     /**
  119.      * @param Request $request
  120.      * @param string $token
  121.      * @param UserPasswordEncoderInterface $passwordEncoder
  122.      * @param UserRepository $userRepository
  123.      * @param TranslatorInterface $translator
  124.      * @Route("/reset_pass/{token}", name="app_reset_password", methods={"POST","GET"})
  125.      * @return Response
  126.      */
  127.     public function resetPassword(Request $requeststring $tokenUserPasswordEncoderInterface $passwordEncoder,
  128.                                   UserRepository $userRepository,TranslatorInterface $translator) : Response
  129.     {
  130.         $user $userRepository->findOneBy(['reset_token' => $token]);
  131.         if ($user === null) {
  132.             $this->addFlash('danger'$translator->trans('login.resetpass.errorToken',[],null,$request->getLocale()));
  133.             return $this->redirectToRoute('app_login');
  134.         }
  135.         $form $this->createForm(NewPasswordFormType::class);
  136.         $form->handleRequest($request);
  137.         if ($form->isSubmitted() && $form->isValid()) {
  138.             try{
  139.                 $user $userRepository->findOneBy(['reset_token' => $token]);
  140.                 $user->setResetToken(null);
  141.                 $user->setPassword($passwordEncoder->encodePassword($user$form->get('newPassword')->getData()));
  142.                 $userRepository->save($user);
  143.                 $this->addFlash('message'$translator->trans('login.resetpass.success',[],null,$request->getLocale()));
  144.                 return $this->redirectToRoute('app_login');
  145.             }catch (\Throwable $throwable){
  146.                 $this->addFlash('danger'$translator->trans('error.error500',[],null,$request->getLocale()));
  147.                 return $this->redirectToRoute('app_login');
  148.             }
  149.         }
  150.         return $this->render('security/reset_password.html.twig', [
  151.             'newPasswordForm' => $form->createView(),
  152.         ]);
  153.     }
  154. }