src/Controller/SecurityController.php line 172

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\RedirectResponse;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  8. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  9. use Exception;
  10. use App\Classes\Mail\MailerFromTwig;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  13. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use App\Repository\UtilisateurRepository;
  17. use App\Entity\Utilisateur;
  18. class SecurityController extends AbstractController
  19. {
  20. /**
  21. * @Route("/deconnexion", name="security_logout")
  22. */
  23. public function logout(): RedirectResponse
  24. {
  25. return $this->redirectToRoute('security_login');
  26. }
  27. /**
  28. * @Route("/creer-mot-de-passe/{token}", name="security_create_password")
  29. */
  30. public function createPassword(Request $request, string $token, UtilisateurRepository $utilisateurRepository, UserPasswordHasherInterface $passwordEncoder, EntityManagerInterface $entityManager): Response
  31. {
  32. $user = $utilisateurRepository->findOneBy(['invitationToken' => $token]);
  33. if (!$user) {
  34. $this->addFlash('danger', 'Ce lien d\'invitation est invalide ou a expiré.');
  35. return $this->redirectToRoute('security_login');
  36. }
  37. if ($request->isMethod('POST')) {
  38. $password = $request->request->get('password');
  39. $passwordConfirm = $request->request->get('password_confirm');
  40. if ($password !== $passwordConfirm) {
  41. $this->addFlash('danger', 'Les mots de passe ne correspondent pas.');
  42. return $this->render('security/create_password.html.twig', ['token' => $token]);
  43. }
  44. $user->setPassword($passwordEncoder->hashPassword($user, $password));
  45. $user->setInvitationToken(null);
  46. $entityManager->flush();
  47. $this->addFlash('success', 'Votre mot de passe a été créé avec succès. Vous pouvez maintenant vous connecter.');
  48. return $this->redirectToRoute('security_login');
  49. }
  50. return $this->render('security/create_password.html.twig', ['token' => $token]);
  51. }
  52. /**
  53. * @Route("/connexion/mot-de-passe-perdu", name="security_password_lost")
  54. * @throws TransportExceptionInterface
  55. */
  56. public function passwordLost(
  57. Request $request,
  58. TokenGeneratorInterface $tokenGenerator,
  59. EntityManagerInterface $entityManager,
  60. MailerFromTwig $myMailer,
  61. UtilisateurRepository $utilisateurRepository
  62. ): Response {
  63. $submittedToken = $request->request->get('token');
  64. if ($request->isMethod('POST') && $this->isCsrfTokenValid('password-lost', $submittedToken)) {
  65. $email = $request->request->get('email');
  66. if ('' === trim($email) || false === filter_var($email, FILTER_VALIDATE_EMAIL)) {
  67. return $this->redirectToRoute('security_login', ['message' => 'Vous devez saisir un email valide']);
  68. }
  69. $user = $utilisateurRepository->findOneBy(['mailPerso' => $email]);
  70. if (null === $user) {
  71. return $this->redirectToRoute('security_login', ['message' => 'Email Inconnu']);
  72. }
  73. $token = $tokenGenerator->generateToken();
  74. try {
  75. $user->setResetToken($token);
  76. $entityManager->flush();
  77. } catch (Exception $e) {
  78. return $this->redirectToRoute('security_login', ['message' => $e->getMessage()]);
  79. }
  80. $url = $this->generateUrl('security_reset_password', ['token' => $token],
  81. UrlGeneratorInterface::ABSOLUTE_URL);
  82. $myMailer->initEmail();
  83. $myMailer->setTemplate('security/mails/passwordLost.html.twig', ['url' => $url, 'user' => $user]);
  84. $myMailer->sendMessage([$user->getMailPerso()], 'Mot de passe perdu');
  85. return $this->render('security/passwordLostConfirm.html.twig');
  86. }
  87. return $this->render('security/passwordLost.html.twig');
  88. }
  89. /**
  90. * @Route("/connexion/init-password/{user}", name="security_password_init", options={"expose"=true})
  91. * @throws TransportExceptionInterface
  92. */
  93. public function initPassword(
  94. UserPasswordHasherInterface $passwordEncoder,
  95. EntityManagerInterface $entityManager,
  96. MailerFromTwig $mailerFromTwig,
  97. Utilisateur $user
  98. ): JsonResponse {
  99. $password = mb_substr(md5(time()), 0, 10);
  100. $passwordEncode = $passwordEncoder->hashPassword($user, $password);
  101. $user->setPassword($passwordEncode);
  102. $entityManager->flush();
  103. $mailerFromTwig->initEmail();
  104. $mailerFromTwig->setTemplate('mails/security/initPassword.txt.twig', [
  105. 'personnel' => $user,
  106. 'password' => $password,
  107. ]);
  108. $mailerFromTwig->sendMessage($user->getMailPerso(), 'Initialisation de votre compte');
  109. $mailerFromTwig->initEmail();
  110. $mailerFromTwig->setTemplate('mails/security/initLogin.txt.twig', [
  111. 'personnel' => $user,
  112. ]);
  113. $mailerFromTwig->sendMessage($user->getMailPerso(), 'Confirmation de votre Login');
  114. return $this->json(true);
  115. }
  116. /**
  117. * @Route("/connexion/reset-password/{token}", name="security_reset_password")
  118. */
  119. public function resetPassword(
  120. Request $request,
  121. string $token,
  122. UtilisateurRepository $utilisateurRepository,
  123. UserPasswordHasherInterface $passwordEncoder,
  124. EntityManagerInterface $entityManager
  125. ): Response {
  126. if ($request->isMethod('POST')) {
  127. $user = $utilisateurRepository->findOneBy(['resetToken' => $token]);
  128. if (null === $user) {
  129. return $this->redirectToRoute('security_login', ['message' => 'Token Inconnu']);
  130. }
  131. $user->setResetToken(null);
  132. $user->setPassword($passwordEncoder->hashPassword($user, $request->request->get('inputPassword')));
  133. $entityManager->flush();
  134. return $this->redirectToRoute('security_login', ['message' => 'Mot de passe mis à jour']);
  135. }
  136. return $this->render('security/reset_password.html.twig', ['token' => $token]);
  137. }
  138. /**
  139. * @Route("/connexion/aide", name="security_aide")
  140. */
  141. public function aide(): Response {
  142. return $this->redirectToRoute('security_login', ['showAide' => 'TRUE', 'message' => 'showAide']);
  143. }
  144. /**
  145. * @Route("/connexion/{message}/{showAide}", name="security_login")
  146. */
  147. public function login(AuthenticationUtils $authenticationUtils, string $message = '', string $showAide = 'FALSE'): Response
  148. {
  149. return $this->render('security/login.html.twig',
  150. [
  151. 'message' => $message,
  152. 'showAide' => $showAide,
  153. 'last_username' => $authenticationUtils->getLastUsername(),
  154. 'error' => $authenticationUtils->getLastAuthenticationError(),
  155. ]);
  156. }
  157. }