src/Security/SlivkiAuthenticator.php line 23

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Security;
  4. use Slivki\Entity\User;
  5. use Slivki\Exception\User\InvalidUserTokenException;
  6. use Slivki\Repository\User\UserRepositoryInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  11. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  15. use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
  16. use Symfony\Component\Security\Http\HttpUtils;
  17. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  18. use Symfony\Component\Security\Core\Security;
  19. final class SlivkiAuthenticator extends AbstractAuthenticator implements AuthenticationEntryPointInterface
  20. {
  21.     public const USER_COOKIE 'visitedoffers4';
  22.     private UserRepositoryInterface $userRepository;
  23.     private HttpUtils $httpUtils;
  24.     private Security $security;
  25.     public function __construct(
  26.         UserRepositoryInterface $userRepository,
  27.         HttpUtils $httpUtils,
  28.         Security $security
  29.     ) {
  30.         $this->userRepository $userRepository;
  31.         $this->httpUtils $httpUtils;
  32.         $this->security $security;
  33.     }
  34.     public function supports(Request $request): ?bool
  35.     {
  36.         return $request->cookies->has(self::USER_COOKIE) && !($this->security->getToken() instanceof SwitchUserToken);
  37.     }
  38.     public function authenticate(Request $request): PassportInterface
  39.     {
  40.         $userToken $request->cookies->get(self::USER_COOKIE);
  41.         if (null === $userToken) {
  42.             throw new InvalidUserTokenException();
  43.         }
  44.         return new SelfValidatingPassport(
  45.             new UserBadge($userToken, fn (): ?User => $this->userRepository->findByToken((string) $userToken)),
  46.         );
  47.     }
  48.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  49.     {
  50.         return null;
  51.     }
  52.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  53.     {
  54.         return $this->httpUtils->createRedirectResponse($request'login'Response::HTTP_FOUND);
  55.     }
  56.     public function start(Request $requestAuthenticationException $authException null): Response
  57.     {
  58.         return $this->httpUtils->createRedirectResponse($request'login'Response::HTTP_FOUND);
  59.     }
  60. }