<?php namespace App\Security; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Routing\Router; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Guard\AbstractGuardAuthenticator; class EmailTokenAuthenticator extends AbstractGuardAuthenticator { private $em; private $router; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function setRouter(Router $router) { $this->router = $router; } /** * Called on every request to decide if this authenticator should be * used for the request. Returning false will cause this authenticator * to be skipped. */ public function supports(Request $request) { return $request->query->has('emailToken'); } /** * Called on every request. Return whatever credentials you want to * be passed to getUser() as $credentials. */ public function getCredentials(Request $request) { return array( 'token' => $request->query->get('emailToken'), ); } public function getUser($credentials, UserProviderInterface $userProvider) { $token = $credentials['token']; $emailToken = $this->em->getRepository('App\Entity\EmailToken') ->findOneByToken($token); return $emailToken->getUser(); } public function checkCredentials($credentials, UserInterface $user) { $emailToken = $user->getEmailToken($credentials['token']); $now = new \DateTime(); return $now < $emailToken->getExpiredAt(); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) { //Redirect with no emailToken return new RedirectResponse($this->router->generate($request->get('_route'), $request->get('_route_params'))); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { return new RedirectResponse($this->router->generate('index')); } /** * Called when authentication is needed, but it's not sent */ public function start(Request $request, AuthenticationException $authException = null) { return null; } public function supportsRememberMe() { return false; } }