src/Controller/Web/SecurityController.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Web;
  3. use App\Entity\User;
  4. use App\Events;
  5. use App\Form\Type\ResetPasswordType;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  8. use Symfony\Component\EventDispatcher\GenericEvent;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  14. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  15. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  16. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  17. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. /**
  20.  * Class SecurityController
  21.  * @package App\Controller\Web
  22.  *
  23.  * @Route("", name="security")
  24.  */
  25. class SecurityController extends AbstractController
  26. {
  27.     /** @var EventDispatcherInterface */
  28.     private $eventDispatcher;
  29.     /** @var TranslatorInterface */
  30.     private $translator;
  31.     public function __construct(
  32.         EventDispatcherInterface $eventDispatcher,
  33.         TranslatorInterface $translator
  34.     )
  35.     {
  36.         $this->eventDispatcher $eventDispatcher;
  37.         $this->translator $translator;
  38.     }
  39.     /**
  40.      * @Route("/login", name="_login")
  41.      *
  42.      * @param AuthenticationUtils $authenticationUtils
  43.      * @return Response
  44.      */
  45.     public function login(AuthenticationUtils $authenticationUtils): Response
  46.     {
  47.         return $this->render('public/login.html.twig', [
  48.             // last username entered by the user (if any)
  49.             'last_username' => $authenticationUtils->getLastUsername(),
  50.             // last authentication error (if any)
  51.             'error' => $authenticationUtils->getLastAuthenticationError(),
  52.         ]);
  53.     }
  54.     /**
  55.      * @Route("/logout", name="_logout", methods={"GET"})
  56.      */
  57.     public function logout()
  58.     {
  59.         // controller can be blank: it will never be executed!
  60.         throw new \Exception('Don\'t forget to activate logout in security.yaml');
  61.     }
  62.     /**
  63.      * @Route("/password-reset", name="_password_reset")
  64.      */
  65.     public function passwordReset(Request $request): Response
  66.     {
  67.         if ($request->isMethod('POST')) {
  68.             $email $request->request->get('_email');
  69.             /** @var User $user */
  70.             $user $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => $email]);
  71.             if (null === $user) {
  72.                 $this->addFlash('danger'$this->translator->trans('The user with email %email% does not exist.', ['%email%' => $email]));
  73.                 return $this->render('public/password-reset.html.twig');
  74.             }
  75.             $event = new GenericEvent($user);
  76.             $this->eventDispatcher->dispatch(Events::PASSWORD_RESET$event);
  77.             $this->addFlash('success''User password reset email sent.');
  78.             return $this->redirectToRoute('homepage');
  79.         }
  80.         return $this->render('public/password-reset.html.twig');
  81.     }
  82.     /**
  83.      * @Route("/password-reset/confirm/{token}", methods={"GET", "POST"}, name="_password_reset_confirm")
  84.      */
  85.     public function resetAction($tokenRequest $requestUserPasswordEncoderInterface $encoder)
  86.     {
  87.         /** @var User $user */
  88.         $user $this->getDoctrine()->getRepository(User::class)->findOneBy(['confirmationToken' => $token]);
  89.         if (null === $user) {
  90.             throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist'$token));
  91.         }
  92.         $form $this->createForm(ResetPasswordType::class);
  93.         $form->handleRequest($request);
  94.         if ($form->isSubmitted() && $form->isValid()) {
  95.             $user->setPassword($encoder->encodePassword($user$form->get('newPassword')->getData()));
  96.             $this->getDoctrine()->getManager()->flush();
  97.             $this->addFlash('success''Your password has been changed!');
  98.             return $this->redirectToRoute('homepage');
  99.         }
  100.         return $this->render('public/password-reset-confirm.html.twig', array(
  101.             'token' => $token,
  102.             'form' => $form->createView(),
  103.         ));
  104.     }
  105.     /**
  106.      * @Route("/impersonate/{token}", methods={"GET", "POST"}, name="_impersonate_user")
  107.      * @param $token
  108.      * @param Request $request
  109.      * @param TokenStorageInterface $tokenInterface
  110.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  111.      * @throws \Exception
  112.      */
  113.     public function impersonateUser($tokenRequest $requestTokenStorageInterface $tokenInterface)
  114.     {
  115.         $user $this->getDoctrine()->getRepository(User::class)->findOneBy(['impersonateToken' => $token]);
  116.         if($user)
  117.         {
  118.             $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  119.             $this->get('security.token_storage')->setToken($token);
  120.             $session $this->get('session');
  121.             $session->set('_security_main'serialize($token));
  122.             $event = new InteractiveLoginEvent($request$token);
  123.             $this->eventDispatcher->dispatch("security.interactive_login"$event);
  124.             /**
  125.              * @var $currentUser User
  126.              */
  127.             $currentUser $tokenInterface->getToken()->getUser();
  128.             $logFromWlpga = new GenericEvent($currentUser);
  129.             $this->eventDispatcher->dispatch(Events::USER_LOGGED_FROM_WLPGA$logFromWlpga);
  130.             $user->setImpersonateToken(User::generateUniqueToken());
  131.             $this->getDoctrine()->getManager()->flush();
  132.             return $this->redirectToRoute('admin_index');
  133.         }
  134.         else
  135.         {
  136.             $this->addFlash('error''Token not found.');
  137.             return $this->redirect('/');
  138.         }
  139.     }
  140. }