src/Controller/BaseSite/Auth/SecurityController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller\BaseSite\Auth;
  3. use App\Entity\Generic\Customer\Customer;
  4. use App\Entity\Generic\User;
  5. use App\Form\Website\NewPasswordType;
  6. use App\Form\Website\ResetPasswordSmsRequestFormType;
  7. use App\Form\Website\VerifySmsCodeType;
  8. use App\Repository\Website\Website\WebsiteRepository;
  9. use App\Service\SmsHandler;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use LogicException;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  17. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Symfony\Component\Security\Core\Security;
  21. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  22. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  23. class SecurityController extends AbstractController
  24. {
  25.     #[Route(path'/website-owner/login'name'shop_owner_login' )]
  26.     public function login(AuthenticationUtils $authenticationUtils): Response
  27.     {
  28.          if ($this->getUser()) {
  29.              return $this->redirectToRoute('app_user_handler');
  30.          }
  31.         // get the login error if there is one
  32.         $error $authenticationUtils->getLastAuthenticationError();
  33.         // last username entered by the user
  34.         $lastUsername $authenticationUtils->getLastUsername();
  35.         return $this->render('@baseAuth/security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  36.     }
  37.     #[Route(path'/website-owner/user-handler'name'app_user_handler')]
  38.     public function userHandler(Security $security WebsiteRepository $shopRepository): RedirectResponse
  39.     {
  40.         $user $security->getUser();
  41.         if ($user->hasRole('ROLE_ADMIN')){
  42.             return $this->redirectToRoute('app_admin_dashboard');
  43.         }
  44.         if (count($shopRepository->findBy(['owner' => $user])) < 1){
  45.             return  $this->redirectToRoute('app_base_site_user_setup_setup');
  46.         }
  47.         return $this->redirectToRoute('app_user_dashboard');
  48.     }
  49.     #[Route(path'/website-owner/logout'name'shop_owner_logout')]
  50.     public function logout(): void
  51.     {
  52.         throw new LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  53.     }
  54.     #[Route('/website-owner/forgot-password/sms'name'shop_owner_forgot_password_sms')]
  55.     public function requestSmsReset(
  56.         Request                 $request,
  57.         EntityManagerInterface  $em,
  58.         SmsHandler                     $smsSender,
  59.         TokenGeneratorInterface $tokenGenerator,
  60.     ): Response
  61.     {
  62.         $form $this->createForm(ResetPasswordSmsRequestFormType::class);
  63.         $form->handleRequest($request);
  64.         if ($form->isSubmitted() && $form->isValid()) {
  65.             $phone $form->get('phoneNumber')->getData();
  66.             /**
  67.              * @var User $user
  68.              */
  69.             $user $em->getRepository(User::class)->findOneBy(['identifier' => $phone]);
  70.             if ($user) {
  71.                 $code random_int(100000999999);
  72.                 $user->setVerifyCode($code);
  73. //                $user->setPasswordResetAt(new \DateTime());
  74.                 $em->flush();
  75.                 $smsSender->sendCode($phone$code);
  76.             }
  77.             $this->addFlash('success''در صورت ثبت شماره صحیح، کدی برای شما ارسال خواهد شد');
  78.             return $this->redirectToRoute('shop_owner_verify_sms_code');
  79.         }
  80.         return $this->render('@baseAuth/request_sms_reset.html.twig', [
  81.             'form' => $form->createView(),
  82.         ]);
  83.     }
  84.     #[Route('/website-owner/forgot-password/sms/verify'name'shop_owner_verify_sms_code')]
  85.     public function verifyCode(
  86.         Request                $request,
  87.         EntityManagerInterface $em,
  88.         UrlGeneratorInterface  $urlGenerator,
  89.         SessionInterface       $session
  90.     ): Response
  91.     {
  92.         $form $this->createForm(VerifySmsCodeType::class);
  93.         $form->handleRequest($request);
  94.         if ($form->isSubmitted() && $form->isValid()) {
  95.             $phone $form->get('phoneNumber')->getData();
  96.             $code $form->get('code')->getData();
  97.             $user $em->getRepository(User::class)->findOneBy(['identifier' => $phone'verifyCode' => $code]);
  98. //            if ($user && $user->getPasswordResetAt() > (new \DateTime('-10 minutes'))) {
  99.             if (true) {
  100.                 // ذخیره موقتی کاربر برای مرحله بعدی
  101.                 $session->set('reset_user_id'$user->getId());
  102.                 return $this->redirectToRoute('shop_owner_reset_password_form');
  103.             }
  104.             $this->addFlash('danger''کد وارد شده صحیح نیست یا منقضی شده');
  105.         }
  106.         return $this->render('@baseAuth/verify_sms_code.html.twig', [
  107.             'form' => $form->createView(),
  108.         ]);
  109.     }
  110.     #[Route('/website-owner/forgot-password/sms/reset'name'shop_owner_reset_password_form')]
  111.     public function resetPassword(
  112.         Request                     $request,
  113.         EntityManagerInterface      $em,
  114.         UserPasswordHasherInterface $hasher,
  115.         SessionInterface            $session
  116.     ): Response
  117.     {
  118.         $userId $session->get('reset_user_id');
  119.         if (!$userId) {
  120.             return $this->redirectToRoute('shop_owner_forgot_password_sms');
  121.         }
  122.         $user $em->getRepository(User::class)->find($userId);
  123.         if (!$user) {
  124.             return $this->redirectToRoute('shop_owner_forgot_password_sms');
  125.         }
  126.         $form $this->createForm(NewPasswordType::class);
  127.         $form->handleRequest($request);
  128.         if ($form->isSubmitted() && $form->isValid()) {
  129.             $password $form->get('newPassword')->getData();
  130.             $user->setPassword($hasher->hashPassword($user$password));
  131.             $user->setVerifyCode(null);
  132. //            $user->setPasswordResetAt(null);
  133.             $em->flush();
  134.             $session->remove('reset_user_id');
  135.             $this->addFlash('success''رمز عبور با موفقیت تغییر کرد');
  136.             return $this->redirectToRoute('shop_owner_login');
  137.         }
  138.         return $this->render('@baseAuth/reset_password.html.twig', [
  139.             'form' => $form->createView(),
  140.         ]);
  141.     }
  142. }