src/Controller/SecurityController.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Users;
  4. use App\Form\ResetPassType;
  5. use App\Repository\UsersRepository;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  13. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  14. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. class SecurityController extends AbstractController
  17. {
  18.     /**
  19.      * @Route("/login", name="app_login")
  20.      */
  21.     public function login(AuthenticationUtils $authenticationUtils): Response
  22.     {
  23.         // if ($this->getUser()) {
  24.         //    $this->redirectToRoute('target_path');
  25.         // }
  26.         // get the login error if there is one
  27.         $error $authenticationUtils->getLastAuthenticationError();
  28.         // last username entered by the user
  29.         $lastUsername $authenticationUtils->getLastUsername();
  30.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  31.     }
  32.     /**
  33.      * @Route("/logout", name="app_logout")
  34.      */
  35.     public function logout()
  36.     {
  37.         throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
  38.     }
  39.     /**
  40.      * @Route("/oubli-pass", name="app_forgotten_password")
  41.      */
  42.     public function oubliPass(Request $requestUsersRepository $users, \Swift_Mailer $mailerTokenGeneratorInterface $tokenGenerator
  43.     ): Response
  44.     {
  45.         // On initialise le formulaire
  46.         $form $this->createForm(ResetPassType::class);
  47.         // On traite le formulaire
  48.         $form->handleRequest($request);
  49.         // Si le formulaire est valide
  50.         if ($form->isSubmitted() && $form->isValid()) {
  51.             // On récupère les données
  52.             $donnees $form->getData();
  53.             // On cherche un utilisateur ayant cet e-mail
  54.             $user $users->findOneByEmail($donnees['email']);
  55.             // Si l'utilisateur n'existe pas
  56.             if ($user === null) {
  57.                 // On envoie une alerte disant que l'adresse e-mail est inconnue
  58.                 $this->addFlash('danger''Cette adresse e-mail est inconnue');
  59.                 
  60.                 // On retourne sur la page de connexion
  61.                 return $this->redirectToRoute('app_login');
  62.             }
  63.             // On génère un token
  64.             $token $tokenGenerator->generateToken();
  65.             // On essaie d'écrire le token en base de données
  66.             try{
  67.                 $user->setResetToken($token);
  68.                 $entityManager $this->getDoctrine()->getManager();
  69.                 $entityManager->persist($user);
  70.                 $entityManager->flush();
  71.             } catch (\Exception $e) {
  72.                 $this->addFlash('warning'$e->getMessage());
  73.                 return $this->redirectToRoute('app_login');
  74.             }
  75.             // On génère l'URL de réinitialisation de mot de passe
  76.             $url $this->generateUrl('app_reset_password', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
  77.             // On génère l'e-mail
  78.             $message = (new \Swift_Message('Mot de passe oublié'))
  79.                 ->setFrom('no-reply@nouvelle-techno.fr')
  80.                 ->setTo($user->getEmail())
  81.                 ->setBody(
  82.                     "Bonjour,<br><br>Une demande de réinitialisation de mot de passe a été effectuée pour le site Nouvelle-Techno.fr. Veuillez cliquer sur le lien suivant : " $url,
  83.                     'text/html'
  84.                 )
  85.             ;
  86.             // On envoie l'e-mail
  87.             $mailer->send($message);
  88.             // On crée le message flash de confirmation
  89.             $this->addFlash('message''E-mail de réinitialisation du mot de passe envoyé !');
  90.             // On redirige vers la page de login
  91.             return $this->redirectToRoute('app_login');
  92.         }
  93.         // On envoie le formulaire à la vue
  94.         return $this->render('security/forgotten_password.html.twig',['emailForm' => $form->createView()]);
  95.     }
  96.     /**
  97.      * @Route("/reset_pass/{token}", name="app_reset_password")
  98.      */
  99.     public function resetPassword(Request $requeststring $tokenUserPasswordEncoderInterface $passwordEncoder)
  100.     {
  101.         // On cherche un utilisateur avec le token donné
  102.         $user $this->getDoctrine()->getRepository(Users::class)->findOneBy(['reset_token' => $token]);
  103.         // Si l'utilisateur n'existe pas
  104.         if ($user === null) {
  105.             // On affiche une erreur
  106.             $this->addFlash('danger''Token Inconnu');
  107.             return $this->redirectToRoute('app_login');
  108.         }
  109.         // Si le formulaire est envoyé en méthode post
  110.         if ($request->isMethod('POST')) {
  111.             // On supprime le token
  112.             $user->setResetToken(null);
  113.             // On chiffre le mot de passe
  114.             $user->setPassword($passwordEncoder->encodePassword($user$request->request->get('password')));
  115.             // On stocke
  116.             $entityManager $this->getDoctrine()->getManager();
  117.             $entityManager->persist($user);
  118.             $entityManager->flush();
  119.             // On crée le message flash
  120.             $this->addFlash('message''Mot de passe mis à jour');
  121.             // On redirige vers la page de connexion
  122.             return $this->redirectToRoute('app_login');
  123.         }else {
  124.             // Si on n'a pas reçu les données, on affiche le formulaire
  125.             return $this->render('security/reset_password.html.twig', ['token' => $token]);
  126.         }
  127.     }
  128.     
  129.     /**
  130.      * @Route(name="api_login", path="/api/login_check")
  131.      * @IsGranted("ROLE_API")
  132.      * @return JsonResponse
  133.      */
  134.     public function api_login(): JsonResponse
  135.     {
  136.         $user $this->getUser();
  137.         return new JsonResponse([
  138.             'email' => $user->getEmail(),
  139.             'roles' => $user->getRoles(),
  140.         ]);
  141.     }
  142. }