src/Controller/SecurityFrontController.php line 54

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Controller;
  3. use Acme\SudcmsBundle\Entity\AuthUser;
  4. use Acme\SudcmsBundle\Entity\EcoCustomers;
  5. use Acme\SudcmsBundle\Form\Ecommerce\CustomerFrontType;
  6. use Acme\SudcmsBundle\Form\Ecommerce\FrontLoginType;
  7. use Acme\SudcmsBundle\Form\ResetPassType;
  8. use Acme\SudcmsBundle\Repository\AuthUserRepository;
  9. use Acme\SudcmsBundle\Service\ApiService;
  10. use Acme\SudcmsBundle\Service\MailerService;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  17. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  18. class SecurityFrontController extends AbstractController
  19. {
  20.     private ApiService $apiService;
  21.     public function __construct(ApiService $apiService)
  22.     {
  23.         $this->apiService $apiService;
  24.     }
  25.     #[Route(path'/connexion'name'front_app_login')]
  26.     public function login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  27.     {
  28.         if (!$this->apiService->testConnexion()) {
  29.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  30.             return $this->redirectToRoute('front_home');
  31.         }
  32.         if ($this->getUser()) {
  33.             return $this->redirectToRoute('front_shopping_categorie');
  34.         }
  35.         // get the login error if there is one
  36.         $error $authenticationUtils->getLastAuthenticationError();
  37.         // last username entered by the user
  38.         $lastUsername $authenticationUtils->getLastUsername();
  39.         // init formulaire de création de compte
  40.         $formCreateAccount $this->createForm(CustomerFrontType::class, new EcoCustomers(), []);
  41.         // init formulaire connexion
  42.         $formLogin $this->createForm(FrontLoginType::class, new AuthUser());
  43.         $request->getSession()->set('previous_route''front_app_login');
  44.         return $this->render('@main-app/security_front/login.html.twig', [
  45.             'last_username' => $lastUsername,
  46.             'error' => $error,
  47.             'form' => $formCreateAccount->createView(),
  48.             'formLogin' => $formLogin->createView(),
  49.             'pageAccount' => 'Connexion',
  50.         ]);
  51.     }
  52.     #[Route(path'/deconnexion'name'front_app_logout'methods: ['GET'])]
  53.     public function logout()
  54.     {
  55.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  56.     }
  57.     /**
  58.      * @throws \Exception
  59.      */
  60.     #[Route(path'/mot-de-passe-oublie'name'front_forgotten_password')]
  61.     public function forgotten_password(Request       $requestAuthUserRepository $users,
  62.                                        MailerService $mailerService): Response
  63.     {
  64.         // On initialise le formulaire
  65.         $form $this->createForm(ResetPassType::class);
  66.         // On traite le formulaire
  67.         $form->handleRequest($request);
  68.         // Si le formulaire est valide
  69.         if ($form->isSubmitted() && $form->isValid()) {
  70.             // On récupère les données
  71.             $donnees $form->getData();
  72.             // On cherche un utilisateur ayant cet e-mail
  73.             $user $users->findOneBy(['email' => $donnees['email']]);
  74.             // Si l'utilisateur n'existe pas
  75.             if ($user === null) {
  76.                 // On envoie une alerte disant que l'adresse e-mail est inconnue
  77.                 $this->addFlash('danger''Cette adresse e-mail est inconnue');
  78.                 // On retourne sur la page de connexion
  79.                 return $this->redirectToRoute('front_app_login');
  80.             }
  81.             // On génère un token
  82.             $token bin2hex(random_bytes(60));
  83.             // On essaie d'écrire le token en base de données
  84.             try {
  85.                 $user->setResetToken($token);
  86.                 $entityManager $this->getDoctrine()->getManager();
  87.                 $entityManager->persist($user);
  88.                 $entityManager->flush();
  89.             } catch (\Exception $e) {
  90.                 $this->addFlash('danger'$e->getMessage());
  91.                 return $this->redirectToRoute('front_app_login');
  92.             }
  93.             // On génère l'URL de réinitialisation de mot de passe
  94.             $url $this->generateUrl('front_app_reset_password_front', array('token' => $token),
  95.                 UrlGeneratorInterface::ABSOLUTE_URL);
  96.             $mailerService->fromEmail $user->getEmail();
  97.             $mailerService->fromName $this->getParameter('SITE' CURRENT_SITE_ID '_HOST');
  98.             $mailerService->subject 'Mot de passe oublié - ' $this->getParameter('SITE' CURRENT_SITE_ID '_HOST');
  99.             $allRecipients[] = [
  100.                 "nom" => $user->getLastName(),
  101.                 "prenom" => $user->getFirstName(),
  102.                 "email" => $user->getEmail(),
  103.                 "type" => "to"
  104.             ];
  105.             $htmlContent $this->renderView("layouts/layouts_emails/forgotten_password.html.twig", [
  106.                 'url' => $url
  107.             ]);
  108.             $mailerService->sendMail($allRecipients$htmlContent, [], null);
  109.             // On crée le message flash de confirmation
  110.             $this->addFlash('success''Un e-mail pour réinitialiser votre mot de passe vous a été envoyé !');
  111.             // On redirige vers la page de login
  112.             return $this->redirectToRoute('front_app_login');
  113.         }
  114.         // On envoie le formulaire à la vue
  115.         //        return $this->render('security_front/forgotten_password.html.twig', ['emailForm' => $form->createView()]);
  116.         return $this->render('@main-app/front/front_customer_account/forgot_password.html.twig', [
  117.             'pageAccount' => 'mdpOublie',
  118.             'form' => $form->createView()
  119.         ]);
  120.     }
  121.     #[Route(path'/nouveau-mot-de-passe-front/{token}'name'front_app_reset_password_front')]
  122.     public function resetPassword(Request $requeststring $tokenUserPasswordEncoderInterface $passwordEncoder)
  123.     {
  124.         // On cherche un utilisateur avec le token donné
  125.         $user $this->getDoctrine()->getRepository(AuthUser::class)->findOneBy(['reset_token' => $token]);
  126.         // Si l'utilisateur n'existe pas
  127.         if ($user === null) {
  128.             // On affiche une erreur
  129.             $this->addFlash('danger''Token Inconnu');
  130.             return $this->redirectToRoute('front_app_login');
  131.         }
  132.         // Si le formulaire est envoyé en méthode post
  133.         if ($request->isMethod('POST')) {
  134.             // On supprime le token
  135.             $user->setResetToken(null);
  136.             // On chiffre le mot de passe
  137.             $user->setPassword($passwordEncoder->encodePassword($user$request->request->get('password')));
  138.             // On stocke
  139.             $entityManager $this->getDoctrine()->getManager();
  140.             $entityManager->persist($user);
  141.             $entityManager->flush();
  142.             // On crée le message flash
  143.             $this->addFlash('success''Mot de passe mis à jour');
  144.             // On redirige vers la page de connexion
  145.             return $this->redirectToRoute('front_app_login');
  146.         } else {
  147.             // Si on n'a pas reçu les données, on affiche le formulaire
  148.             return $this->render('@main-app/security_front/reset_password.html.twig', ['token' => $token]);
  149.         }
  150.     }
  151. }