src/Controller/SecurityController.php line 37

Open in your IDE?
  1. <?php
  2. /*
  3. * Ce fichier est la propriété de l'association (c) Projets Métiers
  4. *
  5. * (c) crée par Jean-Marc CATALA <jeanmmarccatala@gmail.com>
  6. *
  7. */
  8. namespace App\Controller;
  9. use App\Entity\User;
  10. use App\Form\RegistrationFormType;
  11. use App\Form\ResetPassType;
  12. use App\Repository\UserRepository;
  13. use App\Service\EmailService;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  18. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use App\Security\PwdFormAuthenticator;
  21. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  22. use function bin2hex;
  23. use function dump;
  24. use function random_bytes;
  25. class SecurityController extends AbstractController
  26. {
  27. /**
  28. * @Route("/login", name="app_login")
  29. */
  30. public function login(AuthenticationUtils $authenticationUtils)
  31. {
  32. // get the login error if there is one
  33. $error = $authenticationUtils->getLastAuthenticationError();
  34. // last username entered by the user
  35. $lastUsername = $authenticationUtils->getLastUsername();
  36. return $this->render('security/login.html.twig', [
  37. 'last_username' => $lastUsername,
  38. 'error' => $error,
  39. ]);
  40. }
  41. /**
  42. * @Route("/logout", name="app_logout")
  43. */
  44. public function logout()
  45. {
  46. throw new \Exception('Interception! - try/catch');
  47. }
  48. /**
  49. * @Route("/recuperation-mot-de-passe", name="app_forgotten_password")
  50. */
  51. public function oubliPass(Request $request, UserRepository $users, EmailService $emailService, UserPasswordEncoderInterface $passwordEncoder
  52. ): Response
  53. {
  54. // On initialise le formulaire
  55. $form = $this->createForm(ResetPassType::class);
  56. // On traite le formulaire
  57. $form->handleRequest($request);
  58. // Si le formulaire est valide
  59. if ($form->isSubmitted() && $form->isValid()) {
  60. // On récupère les données
  61. $donnees = $form->getData();
  62. // On cherche un utilisateur ayant cet e-mail
  63. $user = $users->findOneByEmail($donnees['email']);
  64. // Si l'utilisateur n'existe pas
  65. if ($user === null) {
  66. // On envoie une alerte disant que l'adresse e-mail est inconnue
  67. $this->addFlash('danger', 'Cette adresse e-mail est inconnue');
  68. // On retourne sur la page de connexion
  69. return $this->redirectToRoute('app_login');
  70. }
  71. // On génère un token
  72. $token = $this->newToken() ;
  73. // On essaie d'écrire le token en base de données
  74. $user->setToken($this->newToken());
  75. $entityManager = $this->getDoctrine()->getManager();
  76. $entityManager->persist($user);
  77. $entityManager->flush();
  78. // On génère l'e-mail
  79. $emailService->sendEmail([
  80. 'to' => $user->getEmail(),
  81. 'toName' => $user->getName(),
  82. 'template' => 'emails/recup.email.twig',
  83. 'subject' => 'Récuperation du mot de passe',
  84. 'context' => [
  85. 'user'=> $user,
  86. ],
  87. ]);
  88. // On crée le message flash de confirmation
  89. $this->addFlash('success', 'E-mail de réinitialisation du mot de passe envoyé !');
  90. // On redirige vers la page de login
  91. return $this->redirectToRoute('app_login');
  92. }
  93. // On envoie le formulaire à la vue
  94. return $this->render('security/forgotten_password.html.twig',['emailForm' => $form->createView()]);
  95. }
  96. public function newToken(){
  97. $bytes = random_bytes(15);
  98. return bin2hex($bytes);
  99. }
  100. /**
  101. * @Route("/register-verification-recup/{email}/{token}", name="app_register_verification_recup")
  102. */
  103. public function verifMailrecup(User $user , GuardAuthenticatorHandler $guardHandler, PwdFormAuthenticator $authenticator, Request $request){
  104. $user->setToken($this->newToken());
  105. $em= $this->getDoctrine()->getManager();
  106. $em->flush();
  107. $this->addFlash('success', 'Vous pouvez maintenant changer votre mot de passe');
  108. return $guardHandler->authenticateUserAndHandleSuccess(
  109. $user,
  110. $request,
  111. $authenticator,
  112. 'main' // firewall name in security.yaml
  113. );
  114. }
  115. /**
  116. * @Route("/after-login", name="after_login")
  117. */
  118. public function afterLogin()
  119. {
  120. return $this->render('security/afterLogin.html.twig');
  121. }
  122. }