src/Controller/SecurityController.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  7. use App\Repository\UserRepository;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  10. use Symfony\Component\Mailer\MailerInterface;
  11. use Symfony\Component\Mime\BodyRendererInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use App\Form\ResetPasswordRequestFormType;
  14. use App\Form\ResetPasswordFormType;
  15. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  16. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  17. use Symfony\Component\Mime\Address;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. class SecurityController extends AbstractController
  20. {
  21.     /**
  22.      * @Route("/connexion", name="app_login")
  23.      */
  24.     public function login(AuthenticationUtils $authenticationUtils): Response
  25.     {
  26.         $error $authenticationUtils->getLastAuthenticationError();
  27.         // last username entered by the user
  28.         $lastUsername $authenticationUtils->getlastUsername();
  29.         return $this->render('registration/login.html.twig', [
  30.             'last_username' => $lastUsername
  31.             'error' => $error
  32.         ]);
  33.     }
  34.     /**
  35.      * @Route("/deconnection", name="app_logout")
  36.      */
  37.     public function logout()
  38.     {
  39.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  40.     }
  41.     /**
  42.      * @Route("/oublie-passe", name="app_forgotten_password")
  43.      */
  44.     public function forgottenPassword(Request $requestUserRepository $userRepositoryTokenGeneratorInterface $tokenGeneratorManagerRegistry $doctrineMailerInterface $mailer) : Response
  45.     {
  46.         $form $this->createForm(ResetPasswordRequestFormType::class);
  47.         $form->handleRequest($request);
  48.         if($form->isSubmitted() && $form->isValid()) {
  49.             //On va chercher l'utilisateur par son email
  50.             $user $userRepository->findOneByEmail($form->get('email')->getData());
  51.             // On vérifie si on a un utilisateur
  52.             if($user){
  53.                 // On génère un token de réinitialisation
  54.                 $token $tokenGenerator->generateToken();
  55.                 $user->setResetToken($token);
  56.                 $doctrine->getManager()->persist($user);
  57.                 $doctrine->getManager()->flush();
  58.                 // On génère un lien de réinitialisation du mot de passe
  59.                 $url $this->generateUrl('app_reset_pass', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
  60.                 // Envoi du mail
  61.                 $email = (new TemplatedEmail())
  62.                     ->from('[email protected]')
  63.                     ->to($user->getEmail())
  64.                     ->subject('Votre demande de mot de passe')
  65.                     // path of the Twig template to render
  66.                     // ->htmlTemplate('emails/signup.html.twig')
  67.                     ->htmlTemplate('emails/lost-password.html.twig')
  68.                     // pass variables (name => value) to the template
  69.                     ->context([
  70.                         'url' => $url,
  71.                         'user' => $user,
  72.                     ])
  73.                 ;
  74.                $mailer->send($email);
  75.                 $this->addFlash('success''Email envoyé avec succès');
  76.                 return $this->redirectToRoute('app_login');
  77.             }
  78.             // $user est null
  79.             $this->addFlash('danger''Un problème est survenu');
  80.             return $this->redirectToRoute('app_login');
  81.         }
  82.         return $this->render('security/reset_password_request.html.twig', [
  83.             'requestPassForm' => $form->createView(),
  84.         ]);
  85.     }
  86.     /**
  87.      * @Route("/oublie-passe/{token}", name="app_reset_pass")
  88.      */
  89.     public function resetPassstring ($tokenRequest $requestUserRepository $userRepositoryManagerRegistry $doctrineUserPasswordHasherInterface $passwordHasher): Response
  90.     {
  91.         // On vérifie si on a ce token dans la base
  92.         $user $userRepository->findOneByResetToken($token);
  93.         
  94.         // On vérifie si l'utilisateur existe
  95.         if($user) {
  96.             $form $this->createForm(ResetPasswordFormType::class);
  97.             $form->handleRequest($request);
  98.             if($form->isSubmitted() && $form->isValid()){
  99.                 // On efface le token
  100.                 $user->setResetToken('');
  101.                 
  102.                 
  103.                 // On enregistre le nouveau mot de passe en le hashant
  104.                 $user->setPassword(
  105.                     $passwordHasher->hashPassword(
  106.                         $user,
  107.                         $form->get('password')->getData()
  108.                     )
  109.                 );
  110.                 $doctrine->getManager()->persist($user);
  111.                 $doctrine->getManager()->flush();
  112.                 $this->addFlash('success''Mot de passe changé avec succès');
  113.                 return $this->redirectToRoute('app_login');
  114.             }
  115.             return $this->render('security/reset_password.html.twig', [
  116.                 'passForm' => $form->createView(),
  117.                 'user' => $user,
  118.             ]);
  119.         } else {
  120.             // Si le token est invalide on redirige vers le login
  121.             $this->addFlash('danger''Vous n\'êtes pas autorisé à accéder à ce lien');
  122.             return $this->redirectToRoute('app_login');
  123.         }
  124.     }
  125. }