src/Security/LoginFormAuthenticator.php line 52

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Security;
  4. use Slivki\Entity\User;
  5. use Slivki\Security\Provider\UserProvider;
  6. use Symfony\Component\HttpFoundation\Cookie;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  13. use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
  17. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  18. use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface;
  19. use Symfony\Component\Security\Http\HttpUtils;
  20. final class LoginFormAuthenticator extends AbstractLoginFormAuthenticator
  21. {
  22.     private HttpUtils $httpUtils;
  23.     private UserProvider $userProvider;
  24.     private string $baseDomain;
  25.     public function __construct(HttpUtils $httpUtilsUserProvider $userProviderstring $baseDomain)
  26.     {
  27.         $this->httpUtils $httpUtils;
  28.         $this->userProvider $userProvider;
  29.         $this->baseDomain $baseDomain;
  30.     }
  31.     protected function getLoginUrl(Request $request): string
  32.     {
  33.         return $this->httpUtils->generateUri($request'login');
  34.     }
  35.     public function supports(Request $request): bool
  36.     {
  37.         return 'login' === $request->attributes->get('_route') && $request->isMethod('POST');
  38.     }
  39.     public function authenticate(Request $request): PassportInterface
  40.     {
  41.         $credentials $this->getCredentials($request);
  42.         return new Passport(
  43.             new UserBadge($credentials['email'], fn (): ?User => $this->userProvider->loadUserByUsername($credentials['email'])),
  44.             new PasswordCredentials($credentials['password']),
  45.             [new RememberMeBadge()],
  46.         );
  47.     }
  48.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  49.     {
  50.         $cookie null;
  51.         if ($token->getUser() instanceof User) {
  52.             $cookie Cookie::create(
  53.                 SlivkiAuthenticator::USER_COOKIE,
  54.                 $token->getUser()->getToken(),
  55.                 time() + 315360000,
  56.                 '/',
  57.                 $this->baseDomain,
  58.             );
  59.         }
  60.         if ($request->isXmlHttpRequest()) {
  61.             $response = new JsonResponse();
  62.             if (null !== $cookie) {
  63.                 $response->headers->setCookie($cookie);
  64.             }
  65.             $response->setData(['result' => true]);
  66.             return $response;
  67.         }
  68.         $response $this->httpUtils->createRedirectResponse($request'homepage'Response::HTTP_FOUND);
  69.         if (null !== $cookie) {
  70.             $response->headers->setCookie($cookie);
  71.         }
  72.         return $response;
  73.     }
  74.     private function getCredentials(Request $request): array
  75.     {
  76.         $credentials = [
  77.             'email' => $request->request->get('email'),
  78.             'password' => (string) $request->request->get('password'),
  79.         ];
  80.         if (!\is_string($credentials['email'])) {
  81.             throw new BadRequestHttpException(sprintf('The key "email" must be a string, "%s" given.', \gettype($credentials['email'])));
  82.         }
  83.         $credentials['email'] = \trim($credentials['email']);
  84.         return $credentials;
  85.     }
  86.     public function start(Request $requestAuthenticationException $authException null): Response
  87.     {
  88.         return $this->httpUtils->createRedirectResponse($request'login'Response::HTTP_FOUND);
  89.     }
  90. }