src/Controller/SecurityController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  9. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  10. use Hackzilla\PasswordGenerator\Generator\ComputerPasswordGenerator;
  11. use Symfony\Component\HttpKernel\KernelInterface;
  12. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  13. //  Entités
  14. use App\Entity\User;
  15. use App\Form\ChangePasswordType;
  16. use App\Security\LoginFormAuthenticator;
  17. class SecurityController extends AbstractController
  18. {
  19.   /**
  20.   * @Route("/contacts/admin/connectAs/{id}", requirements={"id"="\d+"}, options={"expose"=true}, name="connectAs")
  21.    */
  22.   public function connectAs(User $userRequest $requestGuardAuthenticatorHandler $guardHandlerLoginFormAuthenticator $authenticator) {
  23.     $this->get('security.token_storage')->setToken(null);
  24.     $request->getSession()->invalidate();
  25.     return $guardHandler->authenticateUserAndHandleSuccess(
  26.         $user,
  27.         $request,
  28.         $authenticator,
  29.         'main'
  30.     );
  31.   }
  32.   /**
  33.    * @Route("/login", name="app_login")
  34.    */
  35.   public function login(AuthenticationUtils $authenticationUtils): Response
  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.     return $this->render(
  42.       'security/login.html.twig',
  43.       ['last_username' => $lastUsername'error' => $error]
  44.     );
  45.   }
  46.   /**
  47.    * @Route("/contacts/changePwd", options={"expose"=true}, methods={"POST", "GET"}, name="changePwd")
  48.    */
  49.   public function changePwd(Request $requestUserPasswordEncoderInterface $passwordEncoder)
  50.   {
  51.     $em $this->getDoctrine()->getManager();
  52.     $user $this->getUser();
  53.     $form $this->createForm(ChangePasswordType::class, $user);
  54.     $form->handleRequest($request);
  55.     if ($form->isSubmitted() && $form->isValid())
  56.     {
  57.       $oldPassword $request->request->get('change_password')['oldPassword'];
  58.       // Si l'ancien mot de passe est bon on peut le changer
  59.       if ( $passwordEncoder->isPasswordValid($user$oldPassword) )
  60.       {
  61.         $newEncodedPassword $passwordEncoder->encodePassword($user$user->getPlainPassword());
  62.         $user->setPassword($newEncodedPassword);
  63.         $em->persist($user);
  64.         $em->flush();
  65.         return new JsonResponse(['result' => 'ancien mot de passe ok']);
  66.       }
  67.       else
  68.         return new JsonResponse(['result' => 'ancien mot de passe pas bon']);
  69.     }
  70.     //  Rendu
  71.     return $this->render('security/changePasswordForm.html.twig', [
  72.       'form'  => $form->createView(),
  73.       'user'  => $user,
  74.     ]);
  75.   }
  76.   /**
  77.    * @Route("/resetPwd", options={"expose"=true}, methods={"POST", "GET"}, name="resetPwd")
  78.    */
  79.   public function resetPwd(Request $requestUserPasswordEncoderInterface $passwordEncoder, \Swift_Mailer $mailerKernelInterface $kernel)
  80.   {
  81.    if ( $kernel->getEnvironment() == 'dev')
  82.       sleep(1);
  83.     //  Check du token
  84.     $submittedToken $request->request->get('_csrf_reset_token');
  85.     if ( !$this->isCsrfTokenValid('reset-password'$submittedToken) ) {
  86.        //$result  = ['status' => 'fail', 'content' => 'token invalide'];
  87.        $result  = ['status' => 'success''content' => ''];
  88.      return new JsonResponse($result);
  89.     }
  90.     //  Check du mail
  91.     $email $request->request->get('emailInput');
  92.     $em $this->getDoctrine()->getManager();
  93.     $user $em->getRepository(User::class)->findOneBy(['email' => $email]);
  94.     if ( $user )
  95.     {
  96.       //  Création d'un nouveau mot de passe
  97.       $generator = new ComputerPasswordGenerator();
  98.       $generator
  99.         ->setUppercase()
  100.         ->setLowercase()
  101.         ->setNumbers()
  102.         ->setSymbols(false)
  103.         ->setLength(12);
  104.       $password $generator->generatePassword();
  105.       $newEncodedPassword $passwordEncoder->encodePassword($user$password);
  106.       $user->setPassword($newEncodedPassword);
  107.       //  Préparation du mail à envoyer
  108.       $content $this->renderView('security/userResetPasswordMail.html.twig', ['password' => $password]);
  109.       $message = (new \Swift_Message())
  110.         ->setFrom('contact@centre-microkine.fr')
  111.         ->setTo($user->getEmail())
  112.         ->setSubject('Centre de Micropraxie : Nouveau mot de passe')
  113.         ->setBody($content'text/html')
  114.       ;
  115.       //  Envoi du mot de passe par mail
  116.       try
  117.       {
  118.         $mailerResult $mailer->send($message$errors);
  119.       }
  120.       catch(\Swift_TransportException $e)
  121.       {
  122.         $exceptionMessage $e->getMessage() ;
  123.       }
  124.       //  Gestion des erreurs d'envoi de mail :
  125.       if ( isset($exceptionMessage) )
  126.         $reponse = ['status' => 'fail''message' => "Echec de l'envoi de mail"];
  127.       elseif ( $mailerResult === )
  128.         $reponse = ['status' => 'fail''message' => "Echec de l'envoi de mail"];
  129.       elseif ( $mailerResult === )
  130.       {
  131.         $reponse = ['status' => 'success''message' => "Nouveau mot de passe envoyé"];
  132.         $em->flush();
  133.       }
  134.       else
  135.         $reponse = ['status' => 'fail''message' => "Echec de l'envoi de mail"];
  136.     }
  137.     //  mot de passe inconnu
  138.     else
  139.       $reponse = ['status' => 'success''message' => ""];
  140.     // $reponse = ['status' => 'fail', 'message' => "echec envoi de mail", 'user' => $user->displayName(), 'result' => $result];
  141.     //  Rendu
  142.     return new JsonResponse($reponse);
  143.   }
  144. }