baseUrl = $baseUrl; $this->sqlLoginService = $sqlLoginService; $this->passwordHasher = $passwordHasher; } /** * 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): bool { return self::LOGIN_ROUTE === $request->attributes->get('_route') && $request->isMethod('POST'); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey): RedirectResponse { return new RedirectResponse($this->baseUrl . '/connect/login-accept'); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): RedirectResponse { $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception); return new RedirectResponse($this->baseUrl . '/login'); } public function authenticate(Request $request): SelfValidatingPassport { $form = $request->request->get('login'); $login = $form['login']; $plaintextPassword = $form['password']; $rememberMe = isset($form['_remember_me']) ? true : false; $session = $request->getSession(); try { // requête préparée list($remoteHashedPassword, $remoteSalt) = $this->sqlLoginService->fetchPassword($login); } catch (DatabaseConnectionException $e) { $session->set(self::ERROR_PDO, true); throw new AuthenticationException(); } catch (LoginElementsConfigurationException $e) { $session->set(self::ERROR_CONFIGURATION, true); throw new AuthenticationException(); } catch (Exception $exception) { $request->getSession()->set(self::ERROR_LOGIN, true); throw new AuthenticationException(); } if (!$remoteHashedPassword) { throw new Exception('Erreur inconnue'); } try { // Comparaison remote hash et hash du input password + salt $this->passwordHasher->verify($remoteHashedPassword, $plaintextPassword, $remoteSalt); $attributes = $this->sqlLoginService->fetchDatas($login); $user = new User($login, $remoteHashedPassword, $attributes, $rememberMe); $loader = function (string $userIdentifier) use ($user) { return $user->getLogin() == $userIdentifier ? $user : null; }; $passport = new SelfValidatingPassport(new UserBadge($login, $loader)); if ($rememberMe) { $passport->addBadge(new RememberMeBadge()); } $passport->setAttribute('attributes', $user->getAttributes()); return $passport; } catch (InvalidSQLPasswordException $e) { $session->set(self::ERROR_LOGIN, true); throw new AuthenticationException(); } catch (DataToFetchConfigurationException $e) { $session->set(self::ERROR_DATA_TO_FETCH_CONFIGURATION, true); throw new AuthenticationException(); } catch (DatabaseConnectionException $e) { $session->set(self::ERROR_PDO, true); throw new AuthenticationException(); } catch (SecurityPatternConfigurationException $e) { $session->set(self::ERROR_SECURITY_PATTERN_CONFIGURATION, true); throw new AuthenticationException(); } } protected function getLoginUrl(Request $request): string { return $this->baseUrl . '/login'; } }