|
|
// ... lines 1 - 2
|
|
namespace App\Security; |
|
|
// ... lines 4 - 21
|
|
class LoginFormAuthenticator extends AbstractFormLoginAuthenticator |
|
{ |
|
use TargetPathTrait; |
|
|
|
private $entityManager; |
|
private $urlGenerator; |
|
private $csrfTokenManager; |
|
private $passwordEncoder; |
|
|
|
public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder) |
|
{ |
|
$this->entityManager = $entityManager; |
|
$this->urlGenerator = $urlGenerator; |
|
$this->csrfTokenManager = $csrfTokenManager; |
|
$this->passwordEncoder = $passwordEncoder; |
|
} |
|
|
|
public function supports(Request $request) |
|
{ |
|
return 'app_login' === $request->attributes->get('_route') |
|
&& $request->isMethod('POST'); |
|
} |
|
|
|
public function getCredentials(Request $request) |
|
{ |
|
$credentials = [ |
|
'email' => $request->request->get('email'), |
|
'password' => $request->request->get('password'), |
|
'csrf_token' => $request->request->get('_csrf_token'), |
|
]; |
|
$request->getSession()->set( |
|
Security::LAST_USERNAME, |
|
$credentials['email'] |
|
); |
|
|
|
return $credentials; |
|
} |
|
|
|
public function getUser($credentials, UserProviderInterface $userProvider) |
|
{ |
|
$token = new CsrfToken('authenticate', $credentials['csrf_token']); |
|
if (!$this->csrfTokenManager->isTokenValid($token)) { |
|
throw new InvalidCsrfTokenException(); |
|
} |
|
|
|
$user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]); |
|
|
|
if (!$user) { |
|
|
|
throw new CustomUserMessageAuthenticationException('Email could not be found.'); |
|
} |
|
|
|
return $user; |
|
} |
|
|
|
public function checkCredentials($credentials, UserInterface $user) |
|
{ |
|
return $this->passwordEncoder->isPasswordValid($user, $credentials['password']); |
|
} |
|
|
|
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) |
|
{ |
|
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) { |
|
return new RedirectResponse($targetPath); |
|
} |
|
|
|
return new RedirectResponse($this->urlGenerator->generate('app_homepage')); |
|
} |
|
|
|
protected function getLoginUrl() |
|
{ |
|
return $this->urlGenerator->generate('app_login'); |
|
} |
|
} |