src/Controller/Front/SecurityController.php line 98

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\User;
  4. use App\Service\Tools;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Exception;
  7. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  8. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  9. use Symfony\Component\Mailer\MailerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Mime\Address;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  18. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  19. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  20. use Symfony\Component\Security\Http\SecurityEvents;
  21. /**
  22.  * Class SecurityController
  23.  * @package App\Controller
  24.  */
  25. class SecurityController extends AbstractController
  26. {
  27.     private EntityManagerInterface $em;
  28.     public function __construct(
  29.         EntityManagerInterface $em
  30.     ) {
  31.         $this->em $em;
  32.     }
  33.     /**
  34.      * @param AuthenticationUtils $authenticationUtils
  35.      * @param Request $request
  36.      * @param Tools $tools
  37.      * @param EventDispatcherInterface $eventDispatcher
  38.      * @return Response
  39.      * @Route("/login", name="login", options={"expose"=true})
  40.      */
  41.     public function login(
  42.         AuthenticationUtils $authenticationUtils,
  43.         Request $request,
  44.         Tools $tools,
  45.         EventDispatcherInterface $eventDispatcher
  46.     ): Response {
  47.         if ($autoLogin $request->get('al')) {
  48.             $user $this->em->getRepository(User::class)->find($tools->decrypt($autoLogin));
  49.             if ($user) {
  50.                 //On se connecte à l'user
  51.                 $token = new UsernamePasswordToken($usernull'user_provider'$user->getRoles());
  52.                 $this->get('security.token_storage')->setToken($token);
  53.                 $event = new SecurityEvents($request);
  54.                 $eventDispatcher->dispatch($eventSecurityEvents::INTERACTIVE_LOGIN);
  55.                 return $this->redirectToRoute('app_index');
  56.             }
  57.         }
  58.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  59.             return $this->redirectToRoute('app_index');
  60.         }
  61.         // get the login error if there is one
  62.         $error $authenticationUtils->getLastAuthenticationError();
  63.         // last username entered by the user
  64.         $lastUsername $authenticationUtils->getLastUsername();
  65.         return $this->render('front/security/login.html.twig', [
  66.             'last_username' => $lastUsername,
  67.             'error' => $error,
  68.         ]);
  69.     }
  70.     /**
  71.      * @throws Exception
  72.      * @Route("/logout", name="logout")
  73.      */
  74.     public function logout(): void
  75.     {
  76.         throw new Exception('This should never be reached!');
  77.     }
  78.     /**
  79.      * @param Request $request
  80.      * @param MailerInterface $mailer
  81.      * @return RedirectResponse|Response
  82.      * @Route("/password-forget", name="password_forget")
  83.      * @throws TransportExceptionInterface
  84.      */
  85.     public function passwordForget(Request $requestMailerInterface $mailer): RedirectResponse|Response
  86.     {
  87.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  88.             return $this->redirectToRoute('app_index');
  89.         }
  90.         $email $request->get('email');
  91.         $error "";
  92.         if ($request->get('submit_password_forget')) {
  93.             /** @var User $user */
  94.             $user $this->em->getRepository(User::class)->findOneBy([
  95.                 'email' => $email
  96.             ]);
  97.             if ($user) {
  98.                 $hash md5(uniqid('pf'));
  99.                 $user->setHash($hash);
  100.                 $message = (new TemplatedEmail())
  101.                     ->from(new Address($this->getParameter('MAILER_FROM'), $this->getParameter('MAILER_FROM_NAME')))
  102.                     ->to($user->getEmail())
  103.                     ->subject("Mot de passe oublié")
  104.                     ->htmlTemplate('email/user/password_forget.html.twig')
  105.                     ->context([
  106.                         'user' => $user,
  107.                         'hash' => $hash,
  108.                     ]);
  109.                 $mailer->send($message);
  110.                 $this->em->persist($user);
  111.                 $this->em->flush();
  112.             }
  113.             $this->addFlash('success'"Un mail vient d'être envoyé à " $email);
  114.             return $this->redirectToRoute('login');
  115.         }
  116.         return $this->render('front/security/password_forget.html.twig', [
  117.             'email' => $email,
  118.             'error' => $error,
  119.             'body_class' => 'login-container',
  120.         ]);
  121.     }
  122.     /**
  123.      * @param string $hash
  124.      * @param Request $request
  125.      * @param UserPasswordEncoderInterface $passwordEncoder
  126.      * @return RedirectResponse|Response
  127.      * @Route("/password-reset/{hash}", name="password_reset")
  128.      */
  129.     public function passwordReset(string $hashRequest $requestUserPasswordEncoderInterface $passwordEncoder): RedirectResponse|Response
  130.     {
  131.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  132.             return $this->redirectToRoute('app_index');
  133.         }
  134.         $error "";
  135.         /** @var User $user */
  136.         $user $this->em->getRepository(User::class)->findOneBy([
  137.             'hash' => $hash
  138.         ]);
  139.         if ($user && $request->get('submit_password_reset') && ($password $request->get('password'))) {
  140.             if (strlen($password) > 5) {
  141.                 $password $passwordEncoder->encodePassword($user$password);
  142.                 $user->setPassword($password);
  143.                 $user->setHash(null);
  144.                 $this->em->persist($user);
  145.                 $this->em->flush();
  146.                 return $this->redirectToRoute('login');
  147.             } else {
  148.                 $error "Veuillez saisir un mot de passe d'au moins 6 caractères";
  149.             }
  150.         }
  151.         return $this->render('front/security/password_reset.html.twig', [
  152.             'error' => $error,
  153.             'body_class' => 'login-container',
  154.         ]);
  155.     }
  156. }