entityManager = $entityManager; $this->urlGenerator = $urlGenerator; $this->csrfTokenManager = $csrfTokenManager; $this->passwordEncoder = $passwordEncoder; $this->parameterBag = $parameterBag; } public function supports(Request $request) { return self::LOGIN_ROUTE === $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(UserInterface::class)->findOneBy( ['email' => $credentials['email']] ); if (!$user) { // fail authentication with a custom error throw new CustomUserMessageAuthenticationException('Email could not be found.'); } return $user; } public function checkCredentials($credentials, SfUserInterface $user) { return $this->passwordEncoder->isPasswordValid($user, $credentials['password']); } /** * Used to upgrade (rehash) the user's password automatically over time. */ public function getPassword($credentials): ?string { return $credentials['password']; } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey) { $routeName = 'home'; $email = $request->request->get('email'); $loginRedirection = $this->parameterBag->get('lc_sov.login_redirection'); $useReferer = $loginRedirection['redirect_referer']; $rolesRedirection = $loginRedirection['roles_redirection']; if (isset($useReferer) && $useReferer == true) { $url = $request->request->get('_target_path'); } else { $user = $this->entityManager->getRepository(UserInterface::class)->findOneBy(['email' => $email]); if (!empty($user)) { $roles = $user->getRoles(); foreach ($rolesRedirection as $roleRedirect) { if (in_array($roleRedirect['role'], $roles)) { $routeName = $roleRedirect['redirect']; } } } } if (isset($url) && !empty($url)) { return new RedirectResponse($url); } else { return new RedirectResponse($this->urlGenerator->generate($routeName)); } } protected function getLoginUrl() { return $this->urlGenerator->generate(self::LOGIN_ROUTE); } }