src/Controller/SecurityController.php line 44

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\HttpFoundation\Request;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  9. class SecurityController extends AbstractController
  10. {
  11. /**
  12. * @Route("/admin/login", name="app_admin_login")
  13. */
  14. public function login(AuthenticationUtils $authenticationUtils): Response
  15. {
  16. if ($this->getUser()) {
  17. return $this->redirectToRoute('admin');
  18. }
  19. // get the login error if there is one
  20. $error = $authenticationUtils->getLastAuthenticationError();
  21. // last username entered by the user
  22. $lastUsername = $authenticationUtils->getLastUsername();
  23. return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
  24. }
  25. /**
  26. * @Route("/logout", name="app_logout")
  27. */
  28. public function logout(): void
  29. {
  30. throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  31. }
  32. /**
  33. * @Route("/login", name="app_login")
  34. */
  35. public function memberLogin(Request $request, EntityManagerInterface $em): Response
  36. {
  37. if ($request->getSession()->get('member_id')) {
  38. return $this->redirectToRoute('app_espace_membre');
  39. }
  40. $error = null;
  41. if ($request->isMethod('POST')) {
  42. $email = $request->request->get('email');
  43. $otp = $request->request->get('otp');
  44. $member = $em->getRepository(\App\Entity\Member::class)->findOneBy(['email' => $email, 'otp' => $otp]);
  45. if ($member) {
  46. $request->getSession()->set('member_id', $member->getId());
  47. return $this->redirectToRoute('app_espace_membre');
  48. }
  49. $error = "Email ou code secret incorrect.";
  50. }
  51. return $this->render('user/login.html.twig', [
  52. 'error' => $error
  53. ]);
  54. }
  55. /**
  56. * @Route("/member/request-otp", name="app_request_login_otp", methods={"POST"})
  57. */
  58. public function requestLoginOtp(Request $request, EntityManagerInterface $em, \Symfony\Component\Mailer\MailerInterface $mailer): Response
  59. {
  60. $email = $request->request->get('email');
  61. $member = $em->getRepository(\App\Entity\Member::class)->findOneBy(['email' => $email]);
  62. if (!$member) {
  63. return $this->json(['success' => false, 'error' => 'Membre non trouvé avec cet email.']);
  64. }
  65. // Generate new OTP
  66. $otp = strtoupper(substr(bin2hex(random_bytes(4)), 0, 8));
  67. $member->setOtp($otp);
  68. $em->flush();
  69. // Send Email
  70. try {
  71. $emailObj = (new \Symfony\Bridge\Twig\Mime\TemplatedEmail())
  72. ->from(new \Symfony\Component\Mime\Address('wabenin@azilink.com', 'WA BENIN'))
  73. ->to($member->getEmail())
  74. ->subject('Votre code d\'accès WA BENIN')
  75. ->htmlTemplate('emails/adhesion_otp.html.twig')
  76. ->context([
  77. 'member' => $member,
  78. 'otp' => $otp
  79. ]);
  80. $mailer->send($emailObj);
  81. return $this->json(['success' => true]);
  82. } catch (\Exception $e) {
  83. return $this->json(['success' => false, 'error' => 'Erreur lors de l\'envoi de l\'email.']);
  84. }
  85. }
  86. /**
  87. * @Route("/member/logout", name="app_member_logout")
  88. */
  89. public function memberLogout(Request $request): Response
  90. {
  91. $request->getSession()->remove('member_id');
  92. return $this->redirectToRoute('app_home');
  93. }
  94. }