src/Controller/SecurityController.php line 75

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use Symfony\Component\Mime\Email;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Mailer\MailerInterface;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  12. class SecurityController extends AbstractController
  13. {
  14.   /**
  15.    * @Route("/login", name="login")
  16.    */
  17.   public function loginAction(Request $requestAuthenticationUtils $authenticationUtils){
  18.     // get the login error if there is one
  19.     $error $authenticationUtils->getLastAuthenticationError();
  20.     // last username entered by the user
  21.     $lastUsername $authenticationUtils->getLastUsername();
  22.     return $this->render(
  23.       'Security/login.html.twig',
  24.       array(
  25.           // last username entered by the user
  26.           'last_username' => $lastUsername,
  27.           'error'         => $error,
  28.       )
  29.     );
  30.   }
  31.   /**
  32.    * @Route("/login_check", name="login_check")
  33.    */
  34.   public function loginCheck()
  35.   {
  36.   }
  37.   private function sendRecoveryEmail(Request $requestEntityManagerInterface $emMailerInterface $mailer$user)
  38.   {
  39.     $host $request->getHost();
  40.     $token $user->newRecoveryToken();
  41.     
  42.     $em->persist($user);
  43.     $em->flush();
  44.     $message = (new Email())
  45.       ->subject('Recuperacion de contraseña')
  46.       ->to($user->getEmail())
  47.       ->html(
  48.           "Recuperacion de contraseña: https://$host/recovery_pass?rec_token=$token",
  49.           'text/html'
  50.       );
  51.     
  52.     $mailer->send($message);
  53.   }
  54.   /**
  55.    * @Route("/logout", name="app_logout", methods={"GET"})
  56.    */
  57.   public function logout(): void
  58.   {
  59.       // controller can be blank: it will never be called!
  60.       throw new \Exception('Don\'t forget to activate logout in security.yaml');
  61.   }
  62.   /**
  63.    * @Route("/recovery_pass", name="recovery_pass")
  64.    */
  65.   public function recoveryPassAction(Request $requestManagerRegistry $doctrineEntityManagerInterface $emMailerInterface $mailer)
  66.   {
  67.     $requestData $request->request;
  68.     $userRepo $doctrine->getRepository(User::class);
  69.     $mode 'email';
  70.     
  71.     if ($request->query->has('rec_token')) {
  72.       $mode 'password';
  73.       $rec_token $request->query->get('rec_token');
  74.       $user $userRepo->findOneBy(['recoveryToken' => $rec_token]);
  75.         if ($user === null || $user->isRecoveryTokenExpired()) {
  76.           $info_msg 'El enlace de recuperacion no es valido';
  77.           $mode 'none';
  78.         }
  79.     }
  80.     if ($requestData->has('password') && $user) {
  81.       $newPassword $request->get('password');
  82.       $error_msg $this->checkPassword($newPassword$requestData->get('password_c'), $user);
  83.       if (empty($error_msg)) {
  84.         $user->setPassword($newPassword);
  85.         $em->persist($user);
  86.         $em->flush();
  87.         $info_msg "Contraseña actualizada correctamente";
  88.         $to_login true;
  89.         $mode 'none';
  90.       }
  91.     }
  92.     if ($requestData->has('email')) {
  93.       $user $userRepo->findOneBy(['email' => $requestData->get('email')]);
  94.       if ($user !== null) {
  95.         $this->sendRecoveryEmail($request$em$mailer$user);
  96.         $info_msg "Si el correo esta en el sistema se enviara un correo de recuperacion";
  97.         $mode 'none';
  98.       }
  99.     }
  100.     
  101.     return $this->render('Security/passwordRecovery.html.twig', [
  102.       'error_msg' => $error_msg ?? null,
  103.       'info_msg' => $info_msg ?? null,
  104.       'mode' => $mode,
  105.       'rec_token' => $rec_token ?? null,
  106.       'to_login' => $to_login ?? false
  107.     ]);
  108.   }
  109.     private function checkPassword($password$passwordConfirm$user)
  110.     {
  111.       $error_msg null;
  112.       if ($password !== $passwordConfirm) {
  113.         $error_msg "Las contraseñas no son iguales";
  114.       }
  115.       if (strlen($password) < 8) {
  116.         $error_msg 'La contraseña debe ser como minimo de 8 caracteres';
  117.       } 
  118.       if ($user->comparePassword($password)) {
  119.         $error_msg 'No puede ser la misma clave';
  120.       }
  121.       return $error_msg;
  122.     }
  123.     public function loginCheckAction()
  124.     {
  125.     }
  126.     /**
  127.      * @Route("/setup_auth", name="setup_auth")
  128.      */
  129.     public function updatePasswordAction(Request $request)
  130.     {
  131.       $newPassword $request->get('password'null);
  132.       $newPasswordConfirm $request->get('password_c'null);
  133.       $email $request->get('email'null);
  134.       $error_msg null;
  135.       $user $this->getUser();
  136.       if ($user->needsPassSetup) {
  137.         $error_msg $this->checkPassword($newPassword$newPasswordConfirm$user);
  138.       }
  139.       
  140.       if ($user->needsEmailSetup) {
  141.         if (empty($email)) {
  142.           $error_msg 'El email no puede estar vacio';
  143.         }
  144.       }
  145.       
  146.       if (empty($error_msg)) {
  147.         if ($user->needsPassSetup) {
  148.           $user->setPassword($newPassword);
  149.         }
  150.         if ($user->needsEmailSetup) { 
  151.           $user->setEmail($email);
  152.         }
  153.         $em $this->doctrine->getManager();
  154.         $em->persist($user);
  155.         $em->flush();
  156.         return $this->redirectToRoute('home', [], 301);
  157.       }
  158.       return $this->render('Security/requiredUserSetup.html.twig', ['error_msg' => $error_msg]);
  159.     }
  160. }