src/Controller/SecurityController.php line 34

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use Doctrine\Persistence\ManagerRegistry;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\Mailer\MailerInterface;
  8. use Symfony\Component\Mime\Email;
  9. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  10. use App\Entity\Forgotten;
  11. use App\Utils\StringUtils;
  12. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  13. class SecurityController extends AbstractController
  14. {
  15.     const MSG_ERROR 'Il y a eu une erreur, merci de bien vouloir réessayer ultérieurement.';
  16.     const MSG_SUCCESS 'Si un utilisateur existe avec ce courriel, un nouveau mot de passe vient de lui être envoyé.';
  17.     /**
  18.      * @var ManagerRegistry
  19.      */
  20.     private $doctrine;
  21.     public function __construct(
  22.         ManagerRegistry $doctrine
  23.     )
  24.     {
  25.         $this->doctrine $doctrine;
  26.     }
  27.     public function loginAction(AuthenticationUtils $authUtils)
  28.     {
  29. //        exit();
  30.         if ($this->getUser() !== null) {
  31.             return $this->redirectToRoute('admin_homepage');
  32.         }
  33.         $error $authUtils->getLastAuthenticationError();
  34.         $lastUsername $authUtils->getLastUsername();
  35.         return $this->render('security/login.html.twig', [
  36.             'last_username' => $lastUsername,
  37.             'error' => $error
  38.         ]);
  39.     }
  40.     public function logoutAction()
  41.     {
  42.         // Ne devrait jamais se produire car Symfony capture la route en amont
  43.         // et ne doit à priori pas déclencher cette action.
  44.         throw new \Exception('Cela ne devrait jamais se produire');
  45.     }
  46.     public function forgottenAction(
  47.         Request $request,
  48.         MailerInterface $mailer,
  49.         UserPasswordHasherInterface $passwordEncoder)
  50.     {
  51.         if ($this->getUser() !== null) {
  52.             return $this->redirectToRoute('admin_homepage');
  53.         }
  54.         $forgotten = new Forgotten();
  55.         $form $this->createForm('App\Form\Type\ForgottenType'$forgotten);
  56.         $form->handleRequest($request);
  57.         if ($form->isSubmitted() && $form->isValid()) {
  58.             $email $form->getData()->getEmail();
  59.             $error false;
  60.             $user $this->doctrine->getManager()->getRepository(User::class)->loadUserByEmail($email);
  61.             if ($user !== null) {
  62.                 $newPassword StringUtils::random(8);
  63.                 $message = (new Email())
  64.                     ->from($this->getParameter('email_sender'))
  65.                     ->to($user->getEmail())
  66.                     ->subject('Votre nouveau mot de passe')
  67.                     ->html(
  68.                         $this->renderView('emails/forgotten.html.twig', [
  69.                             'new_password' => $newPassword,
  70.                             'url' => $request->getScheme() . '://' $request->getHost()
  71.                         ]),
  72.                         'text/html'
  73.                     );
  74.                 // On enregistre le mot de passe uniquement si l'email a bien été envoyé.
  75.                 try {
  76.                     $mailer->send($message);
  77.                     $user->setPassword($passwordEncoder->hashPassword($user$newPassword));
  78.                     $this->doctrine->getManager()->flush();
  79.                 }
  80.                 catch (\Exception $exception) {
  81.                     $error true;
  82.                     $request->getSession()->getFlashBag()->add('error'self::MSG_ERROR ' : ' $exception->getMessage());
  83.                 }
  84.             }
  85.             // Si le formulaire est correctement utilisé, on évite de trop donner d'informations,
  86.             // on se contente d'indiquer qu'un email a potentiellement été envoyé à son destinataire.
  87.             if (!$error) {
  88.                 $request->getSession()->getFlashBag()->add('success'self::MSG_SUCCESS);
  89.             }
  90.             return $this->redirectToRoute('security_forgotten');
  91.         }
  92.         return $this->render('security/forgotten.html.twig', ['form' => $form->createView()]);
  93.     }
  94. }