src/Infrastructure/Security/Auth/SiteAuthenticator.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Infrastructure\Security\Auth;
  3. use App\Application\EventBus\Event\User\UserAuthenticatedEvent;
  4. use App\Database\Domain\Entity\User\User;
  5. use App\Database\Domain\Entity\User\UserAccessToken;
  6. use App\Database\Domain\Repository\UserRepository;
  7. use App\Infrastructure\Security\Factory\SecurityCookieFactory;
  8. use App\Infrastructure\Messenger\EventBus\EventBusInterface;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\Routing\RouterInterface;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Component\Security\Core\Security;
  16. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  17. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  18. use Symfony\Component\Security\Core\Exception\UserNotFoundException;
  19. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  20. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  21. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
  22. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
  23. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
  24. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  25. class SiteAuthenticator extends AbstractAuthenticator
  26. {
  27.     private UserRepository $userRepository;
  28.     private RouterInterface $router;
  29.     private ManagerRegistry $managerRegistry;
  30.     private UrlGeneratorInterface $urlGenerator;
  31.     private EventBusInterface $eventBus;
  32.     public function __construct(
  33.         UserRepository $userRepository,
  34.         RouterInterface $router,
  35.         ManagerRegistry $managerRegistry,
  36.         UrlGeneratorInterface $urlGenerator,
  37.         EventBusInterface $eventBus
  38.     ) {
  39.         $this->userRepository $userRepository;
  40.         $this->router $router;
  41.         $this->managerRegistry $managerRegistry;
  42.         $this->urlGenerator $urlGenerator;
  43.         $this->eventBus $eventBus;
  44.     }
  45.     public function supports(Request $request): ?bool
  46.     {
  47.         return 'user_login' === $request->get('_route') && $request->isMethod('POST');
  48.     }
  49.     public function authenticate(Request $request): Passport
  50.     {
  51.         $username $request->request->get('login');
  52.         $password $request->request->get('password');
  53.         return new Passport(
  54.             new UserBadge($username, function($userIdentifier) {
  55.                 $user $this->userRepository->findOneBy(['username' => $userIdentifier]);
  56.                 if (!$user) {
  57.                     throw new UserNotFoundException();
  58.                 }
  59.                 return $user;
  60.             }),
  61.             new PasswordCredentials($password),
  62.             [
  63.                 new CsrfTokenBadge(
  64.                     'authenticate',
  65.                     $request->request->get('_csrf_token')
  66.                 ),
  67.                 (new RememberMeBadge())->enable(),
  68.             ]
  69.         );
  70.     }
  71.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  72.     {
  73.         $accessToken UserAccessToken::twoMonths($token->getUser());
  74.         $entityManager $this->managerRegistry->getManager();
  75.         $entityManager->persist($accessToken);
  76.         $entityManager->flush();
  77.         $requestSession $request->getSession();
  78.         $redirectUrl $requestSession->get('is_safari'false)
  79.                         ? $this->urlGenerator->generate('user_login_succeed')
  80.                         : $request->getPathInfo();
  81.         if ($requestSession->get('redirect-uri') == 'ios-login') {
  82.             $redirectUrl $this->urlGenerator->generate('user_ios_login_index');
  83.         } elseif (null !== $requestSession->get('redirect-uri')) {
  84.             $redirectUrl $requestSession->get('redirect-uri');
  85.         }
  86.         if (null !== $requestSession->get('login_url')) {
  87.             $redirectUrl $requestSession->get('login_url');
  88.             $requestSession->remove('login_url');
  89.         }
  90.         $response = new RedirectResponse($redirectUrl);
  91.         $response->headers->setCookie(SecurityCookieFactory::token($accessToken));
  92.         $response->headers->setCookie(SecurityCookieFactory::expiresAt($accessToken));
  93.         $this->eventBus->fire(new UserAuthenticatedEvent($token->getUser()));
  94.         return $response;
  95.     }
  96.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  97.     {
  98.         $requestSession $request->getSession();
  99.         $requestSession->set(Security::AUTHENTICATION_ERROR$exception);
  100.         $params = [
  101.             'safari' => $requestSession->get('is_safari') ? 'true' 'false',
  102.             'redirect-uri' => $requestSession->get('redirect-uri'),
  103.         ];
  104.         return new RedirectResponse(
  105.             $this->urlGenerator->generate('user_login'$params)
  106.         );
  107.     }
  108.     public function start(Request $request, ?AuthenticationException $authException null): ?RedirectResponse
  109.     {
  110.         $route $request->get('_route');
  111.         $routeParams $request->get('_route_params');
  112.         $query $request->query->all();
  113.         if ($specificRouteAfterLogin $query['specific_route_after_login'] ?? null) {
  114.             $request->getSession()->set('login_url'$specificRouteAfterLogin);
  115.         }
  116.         if ($route === 'user_take_gift' || $route === 'user_stripe_invoke_subscription') {
  117.             $loginUrl $this->urlGenerator->generate($routearray_merge($routeParams$query));
  118.             $request->getSession()->set('login_url'$loginUrl);
  119.         }
  120.         return new RedirectResponse($this->getLoginUrl());
  121.     }
  122.     protected function getLoginUrl()
  123.     {
  124.         $session $this->requestStack->getCurrentRequest()->getSession();
  125.         $params = [
  126.             'safari' => $session->get('is_safari') ? 'true' 'false',
  127.             'redirect-uri' => $session->get('redirect-uri'),
  128.         ];
  129.         return $this->urlGenerator->generate('user_login'$params);
  130.     }
  131. }