src/Controller/SecurityFrontController.php line 33

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