src/Controller/SecurityController.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Form\ResetPasswordFormType;
  4. use App\Repository\UserRepository;
  5. use App\Service\SendMailService;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use App\Form\ResetPasswordRequestFormType;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  14. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  15. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  16. class SecurityController extends AbstractController
  17. {
  18.     // ================================= Route de Connection=========================================================================
  19.     #[Route(path'/'name'app_login')]
  20.     public function login(AuthenticationUtils $authenticationUtils): Response
  21.     {
  22.         // Condition qui Permet de savoir si un User est deja connecté ou pas et redirige vers sa page personnelle
  23.         // if ($this->getUser()) {
  24.         //     return $this->redirectToRoute('target_path');
  25.         // }
  26.         // Permet d'obtenir l'erreur de connexion s'il y en a une
  27.         $error $authenticationUtils->getLastAuthenticationError();
  28.         
  29.         // dernier nom d'utilisateur entré par l'utilisateur, pour préremplir le champ
  30.         $lastUsername $authenticationUtils->getLastUsername();
  31.         // on retourne dans la vue, le rendu 
  32.         return $this->render('security/login.html.twig', [
  33.             'last_username' => $lastUsername
  34.             'error' => $error
  35.         ]);
  36.     }
  37.     // ================================= Route de Déconnection=========================================================================
  38.     #[Route(path'/logout'name'app_logout')]
  39.     public function logout(): void
  40.     {
  41.         throw new \LogicException('Cette méthode peut être vide - elle sera interceptée par la clé de déconnexion de votre pare-feu.');
  42.     }
  43.     // ================================= Route Mot de passe oublié =========================================================================
  44.      
  45.     #[Route(path'/oubli-pass'name'app_forgotten_password')]
  46.      public function forgotten_password(Request $requestUserRepository $userRepository,TokenGeneratorInterface $tokenGeneratorInterface,
  47.                                         EntityManagerInterface $entityManagerSendMailService $mail): Response
  48.      {
  49.      
  50.         $form $this->createForm(ResetPasswordRequestFormType::class);
  51.         $form->handleRequest($request);
  52.         // on verifie que ce formulaire a été soumis et valide et voir s'il y a des erreurs
  53.         if($form->isSubmitted()&& $form->isValid()){
  54.             // on va chercher l'utilisateur par son email, pour récupéré ses datas dans le formulaire
  55.             $user $userRepository->findOneByEmail($form->get('email')->getData());
  56.             // on vérifie si on a un user
  57.             if($user){
  58.                 // on génére un token 
  59.                 $token $tokenGeneratorInterface->generateToken();
  60.                 $user -> setResetToken($token);
  61.                 $entityManager -> persist($user);
  62.                 $entityManager -> flush();
  63.                 // on génére un lien de réinitialisation du mot de passe
  64.                 $url $this->generateUrl('reset_pass', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
  65.                 // on crée les données du mail
  66.                 $context compact('url','user');
  67.                 // on envoye le mail au user
  68.                 $mail ->send(
  69.                     'oops@envu2.fr',  
  70.                     $user->getEmail(),
  71.                     'Réinitialisation du mot de passe',
  72.                     'password_reset',
  73.                     $context
  74.                 );
  75.                 $this->addFlash('success','Votre Email envoyé avec succés !');
  76.                 return $this ->redirectToRoute('app_login');
  77.             }
  78.             
  79.             // c'est si, on n'a pas d'utilisateur
  80.             $this->addFlash('danger','Un probléme est survenu');
  81.             return $this ->redirectToRoute('app_login');
  82.         }
  83.         return $this->render('security/reset_password_request.html.twig',[
  84.             // je crée la vue html de mon formulaire et tu la passe à la vue "requestPassForm"
  85.             'requestPassForm' => $form->createView()
  86.         ]);
  87.      }
  88.     // ================================= Route Mot de passe initialisation du token =========================================================================
  89.     #[Route(path'/oubli-pass/{token}'name'reset_pass')]
  90.      public function resetPass(
  91.         string $token,
  92.         Request $requestUserRepository $userRepositoryEntityManagerInterface $entityManagerUserPasswordHasherInterface $userPasswordHasher
  93.         ): Response
  94.      {
  95.         // on verifie si l'on a ce token dans la BDD
  96.         $user $userRepository->findOneByResetToken($token);
  97.         if($user){
  98.             $form $this->createForm(ResetPasswordFormType::class);
  99.             $form ->handleRequest($request);
  100.             // on verifie que ce formulaire a été soumis et valide et voir s'il y a des erreurs
  101.             if($form->isSubmitted() && $form->isValid()){
  102.             // on efface le token
  103.             $user->setResetToken('');
  104.             $user->setPassword(
  105.                 $userPasswordHasher->hashPassword(
  106.                     $user,
  107.                     $form->get('password')->getData()
  108.                 )
  109.             );
  110.             $entityManager -> persist($user);
  111.             $entityManager -> flush();
  112.             $this -> addFlash('success''Votre mot de passe vient d\'être changer avec succés !');
  113.             return $this ->redirectToRoute('app_login');
  114.             
  115.             return $this ->render('security/reset_password.html.twig',[
  116.                 'passForm' => $form->createView()
  117.             ]);
  118.         }
  119.     }
  120.     // si, on a un jeton non valide
  121.     $this->addFlash('danger','Jeton de connection invalide');
  122.     return $this ->redirectToRoute('app_login');
  123.     }
  124. }