src/Controller/SecurityController.php line 162

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Speaker;
  4. use App\Entity\User;
  5. use App\Form\Cabinet\AvatarType;
  6. use App\Form\RegisterSpeakerType;
  7. use App\Form\RegisterType;
  8. use App\Repository\UserRepository;
  9. use App\Service\ImageUploader;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  17. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  18. use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
  19. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  20. use App\Security\EmailVerifier;
  21. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  22. use Symfony\Component\Mime\Address;
  23. class SecurityController extends AbstractController
  24. {
  25.     /**
  26.      * @Route("/login", name="app_login")
  27.      */
  28.     public function login(Request $requestAuthenticationUtils $authenticationUtils): Response
  29.     {
  30. //        if ($this->getUser()) {
  31. //            return $this->redirectToRoute('target_path');
  32. //        }
  33.         // get the login error if there is one
  34.         $error $authenticationUtils->getLastAuthenticationError();
  35.         // last username entered by the user
  36.         $lastUsername $authenticationUtils->getLastUsername();
  37.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  38.     }
  39.     /**
  40.      * @Route("/logout", name="app_logout")
  41.      */
  42.     public function logout()
  43.     {
  44.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  45.     }
  46.     /**
  47.      * @Route("/check-login", name="app_check_login")
  48.      */
  49.     public function checkEmail(Request $requestUserRepository $userRepository): RedirectResponse
  50.     {
  51.         if ($this->getUser()) {
  52.             return $this->redirectToRoute('home');
  53.         }
  54.         $session $request->getSession();
  55.         if ($session->has('oauth_user_info')) {
  56.             $session->remove('oauth_user_info');
  57.         }
  58.         $email $request->get('email');
  59.         $type $request->get('user_type');
  60.         // If exist go to login page
  61.         if ($userRepository->findOneBy(['email' => $email])) {
  62.             return $this->redirectToRoute('app_login', [
  63.                 'email'     => $email,
  64.                 'user_type' => $type,
  65.             ]);
  66.         }
  67.         // Registration page
  68.         return $this->redirectToRoute('app_registration', [
  69.             'email'     => $email,
  70.             'user_type' => $type,
  71.         ]);
  72.     }
  73.     /**
  74.      * @Route("/registration", name="app_registration")
  75.      */
  76.     public function registration(
  77.         Request $request,
  78.         UserPasswordHasherInterface $passwordHasher,
  79.         EmailVerifier $emailVerifier,
  80.         AuthenticationManagerInterface $authenticationManager,
  81.         TokenStorageInterface $tokenStorage,
  82.         ImageUploader $imageUploader
  83.     )
  84.     {
  85.         /**
  86.          * @todo temporary dummy
  87.          */
  88.         //return $this->render('security/registration_dummy.html.twig');
  89.         if ($this->getUser()) {
  90.             return $this->redirectToRoute('home');
  91.         }
  92.         $session $request->getSession();
  93.         $cookies $request->cookies;
  94.         $request->get('user_type') && $request->get('user_type') !== "" $userType $request->get('user_type') : $userType = (int)$cookies->get('user_type');
  95.         if ($userType != 2$userType 1;
  96.         $form = ($userType == 2) ? $this->createForm(RegisterSpeakerType::class) : $this->createForm(RegisterType::class);
  97.         $form->handleRequest($request);
  98.         if ($form->isSubmitted()) {
  99.             if ($form->isValid()) {
  100.                 /* @var User $user */
  101.                 $user $form->getData();
  102.                 $user
  103.                     ->setPassword($passwordHasher->hashPassword($user$form->get('password')->getData()))
  104.                     ->setNotificationEmail($user->getEmail())
  105.                     ->setTimezone('Europe/Moscow');
  106.                 if ($userType == 2) {
  107.                     $user->addRole('ROLE_SPEAKER');
  108. //                  $speaker = (new Speaker())->setUser($user);
  109. //                  $this->getDoctrine()->getManager()->persist($speaker);
  110.                     $avatar $form->get('speaker')->get('photo')->getData();
  111.                     if ($avatar) {
  112.                         if ($user->getAvatar()) {
  113.                             $imageUploader->delete($user->getAvatar());
  114.                         }
  115.                         $user->setAvatar($imageUploader->upload($avatar));
  116.                     }
  117.                 }
  118.                 $this->getDoctrine()->getManager()->persist($user);
  119.                 $this->getDoctrine()->getManager()->flush();
  120.                 // generate a signed url and email it to the user
  121.                 $emailVerifier->sendEmailConfirmation('app_registration_verify'$user,
  122.                     (new TemplatedEmail())
  123.                         ->from(new Address($_ENV['MAILER_FROM_EMAIL'], $_ENV['MAILER_FROM_NAME']))
  124.                         ->to($user->getEmail())
  125.                         ->subject('Please Confirm your Email')
  126.                         ->htmlTemplate('security/confirmation_email.html.twig')
  127.                 );
  128.                 $request->getSession()->set('unconfirmed_user_id'$user->getId());
  129.                 if ($session->has('oauth_user_info')) {
  130.                     $session->remove('oauth_user_info');
  131.                 }
  132.                 $token = new UsernamePasswordToken($user'main'$user->getRoles());
  133.                 $authenticatedToken $authenticationManager->authenticate($token);
  134.                 $tokenStorage->setToken($authenticatedToken);
  135.                 return $this->redirectToRoute($this->getRedirectRoute($user->getRoles()));
  136.             }
  137.         } else {
  138.             if ($session->has('oauth_user_info')) {
  139.                 $authUserInfo $session->get('oauth_user_info');
  140.                 $form->get('email')->setData($authUserInfo['email']);
  141.                 $form->get('firstName')->setData($authUserInfo['first_name']);
  142.                 $form->get('lastName')->setData($authUserInfo['last_name']);
  143.             } else {
  144.                 $form->get('email')->setData($request->get('email'''));
  145.             }
  146.         }
  147.         return $this->render('security/registration.html.twig', [
  148.             'form' => $form->createView(),
  149.             'userType' => $userType
  150.         ]);
  151.     }
  152.     /**
  153.      * @Route("/registration/verify", name="app_registration_verify")
  154.      */
  155.     public function verifyUserEmail(
  156.         Request $request,
  157.         UserRepository $userRepository,
  158.         EmailVerifier $emailVerifier,
  159.         AuthenticationManagerInterface $authenticationManager,
  160.         TokenStorageInterface $tokenStorage
  161.     )
  162.     {
  163.         $id $request->query->get('id'); // retrieve the user id from the url
  164.         // Verify the user id exists and is not null
  165.         if (null === $id) {
  166.             return $this->redirectToRoute('home');
  167.         }
  168.         $user $userRepository->find($id);
  169.         // Ensure the user exists in persistence
  170.         if (null === $user) {
  171.             return $this->redirectToRoute('home');
  172.         }
  173.         if ($request->getSession()->has('unconfirmed_user_id') === false) {
  174.             $request->getSession()->remove('unconfirmed_user_id');
  175.         }
  176.         // validate email confirmation link, sets User::isVerified=true and persists
  177.         try {
  178.             $emailVerifier->handleEmailConfirmation($request$user);
  179.         } catch (\Exception $e) {
  180.             return $this->redirectToRoute($this->getRedirectRoute($user->getRoles()));
  181.         }
  182.         $token = new UsernamePasswordToken($user'main'$user->getRoles());
  183.         $authenticatedToken $authenticationManager->authenticate($token);
  184.         $tokenStorage->setToken($authenticatedToken);
  185.         return $this->redirectToRoute($this->getRedirectRoute($user->getRoles()));
  186.     }
  187.     /**
  188.      * @Route("/registration/confirm", name="app_registration_confirm")
  189.      */
  190.     public function registrationConfirm(Request $request)
  191.     {
  192.         if ($this->getUser() && $this->getUser()->getEmailConfirmed() === true) {
  193.             return $this->redirectToRoute('home');
  194.         }
  195.         if ($request->getSession()->has('unconfirmed_user_id') === false) {
  196.             return $this->redirectToRoute('app_login');
  197.         }
  198.         return $this->render('security/registration_confirm.html.twig');
  199.     }
  200.     /**
  201.      * @Route("/registration/resend", name="app_registration_resend")
  202.      */
  203.     public function registrationResend(
  204.         Request $request,
  205.         UserRepository $userRepository,
  206.         EmailVerifier $emailVerifier
  207.     )
  208.     {
  209. //        if ($this->getUser()) {
  210. //            return $this->redirectToRoute('cabinet.speaker_office.index');
  211. //        }
  212.         if ($request->getSession()->has('unconfirmed_user_id') === false) {
  213.             return $this->redirectToRoute('app_login');
  214.         }
  215.         $id $request->getSession()->get('unconfirmed_user_id');
  216.         $user $userRepository->find($id);
  217.         if (null === $user) {
  218.             return $this->redirectToRoute('home');
  219.         }
  220.         // generate a signed url and email it to the user
  221.         $emailVerifier->sendEmailConfirmation('app_registration_verify'$user,
  222.             (new TemplatedEmail())
  223.                 ->from(new Address($_ENV['MAILER_FROM_EMAIL'], $_ENV['MAILER_FROM_NAME']))
  224.                 ->to($user->getEmail())
  225.                 ->subject('Please Confirm your Email')
  226.                 ->htmlTemplate('security/confirmation_email.html.twig')
  227.         );
  228.         return $this->redirectToRoute($this->getRedirectRoute($user->getRoles()));
  229.     }
  230.     /**
  231.      * @Route("/registration/resent", name="app_registration_resent")
  232.      */
  233.     public function registrationResent(Request $request)
  234.     {
  235.         if ($this->getUser()) {
  236.             return $this->redirectToRoute($this->getRedirectRoute($this->getUser()->getRoles()));
  237.         }
  238.         if ($request->getSession()->has('unconfirmed_user_id') === false) {
  239.             return $this->redirectToRoute('app_login');
  240.         }
  241.         return $this->render('security/registration_resent.html.twig');
  242.     }
  243.     private function getRedirectRoute(array $roles): string
  244.     {
  245.         if (in_array('ROLE_SPEAKER'$roles)){
  246.             return 'cabinet.speaker_office.index';
  247.         }
  248.         return 'app_registration_confirm';
  249.     }
  250. }