src/Security/SelfValidationAuthenticator.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Doctrine\Persistence\ObjectRepository;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  12. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  16. class SelfValidationAuthenticator extends AbstractAuthenticator
  17. {
  18.     private UrlGeneratorInterface $urlGenerator;
  19.     private ObjectRepository $userRepository;
  20.     public function __construct(UrlGeneratorInterface $urlGeneratorEntityManagerInterface $entityManager)
  21.     {
  22.         $this->urlGenerator $urlGenerator;
  23.         $this->userRepository $entityManager->getRepository(User::class);
  24.     }
  25.     public function supports(Request $request): ?bool
  26.     {
  27.         return $request->isMethod('GET') &&
  28.             $this->urlGenerator->generate('self_validating_authentication') === $request->getPathInfo() &&
  29.             $request->getSession()->has('self_validating_authentication_options');
  30.     }
  31.     public function authenticate(Request $request): PassportInterface
  32.     {
  33.         $user $this->getUser($request);
  34.         return new SelfValidatingPassport(
  35.             new UserBadge($user->getEmail())
  36.         );
  37.     }
  38.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  39.     {
  40.         return new RedirectResponse($this->urlGenerator->generate($this->getRedirectPath($request)));
  41.     }
  42.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  43.     {
  44.         return null;
  45.     }
  46.     private function getOptions(Request $request): array
  47.     {
  48.         return $request->getSession()->get('self_validating_authentication_options');
  49.     }
  50.     private function getRedirectPath(Request $request): string
  51.     {
  52.         return $this->getOptions($request)['redirect_to'];
  53.     }
  54.     private function getUserId(Request $request): string
  55.     {
  56.         return $this->getOptions($request)['user_id'];
  57.     }
  58.     private function getUser(Request $request): User
  59.     {
  60.         return $this->userRepository->find($this->getUserId($request));
  61.     }
  62. }