diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index 6e4b75b..71fd3de 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -17,7 +17,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; class SecurityController extends AbstractController { #[Route('/login', name: 'app_login')] - public function login(ParameterBagInterface $params, AuthenticationUtils $authenticationUtils, Request $request, TranslatorInterface $trans): Response + public function login(ParameterBagInterface $params, AuthenticationUtils $authenticationUtils, Request $request, TranslatorInterface $trans): Response|RedirectResponse { // Si l'utilisateur est déjà connecté on le renvoie sur la page du site demandeur if ($this->getUser()) { @@ -32,10 +32,6 @@ class SecurityController extends AbstractController $loginForm->addError(new FormError($trans->trans('error.login', [], 'messages'))); $request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_LOGIN); } - if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_PASSWORD)) { - $loginForm->addError(new FormError($trans->trans('error.login', [], 'messages'))); - $request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_PASSWORD); - } if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_PDO)) { $loginForm->addError(new FormError($trans->trans('error.pdo', [], 'messages'))); $request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_PDO); diff --git a/src/Security/SQLLoginUserAuthenticator.php b/src/Security/SQLLoginUserAuthenticator.php index 5db74cc..6670214 100644 --- a/src/Security/SQLLoginUserAuthenticator.php +++ b/src/Security/SQLLoginUserAuthenticator.php @@ -10,6 +10,7 @@ use App\SQLLogin\Exception\DataToFetchConfigurationException; use App\SQLLogin\Exception\InvalidSQLPasswordException; use App\SQLLogin\Exception\LoginElementsConfigurationException; use App\SQLLogin\Exception\SecurityPatternConfigurationException; +use Exception; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; @@ -24,7 +25,6 @@ class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator { public const LOGIN_ROUTE = 'app_login'; public const ERROR_LOGIN = 'error_login'; - public const ERROR_PASSWORD = 'error_password'; public const ERROR_PDO = 'error_pdo'; public const ERROR_SQL_LOGIN = 'error_sql_login'; public const ERROR_CONFIGURATION = 'error_configuration'; @@ -80,40 +80,42 @@ class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator } 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) { - 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); + 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_PASSWORD, 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(); + $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(); } - $request->getSession()->set(self::ERROR_LOGIN, true); - throw new AuthenticationException(); } protected function getLoginUrl(Request $request): string diff --git a/src/Service/SQLLoginService.php b/src/Service/SQLLoginService.php index ece37cb..2011d60 100644 --- a/src/Service/SQLLoginService.php +++ b/src/Service/SQLLoginService.php @@ -8,6 +8,7 @@ use App\SQLLogin\Exception\LoginElementsConfigurationException; use App\SQLLogin\Exception\NullDataToFetchException; use App\SQLLogin\SQLLoginConnect; use App\SQLLogin\SQLLoginRequest; +use Exception; use PDO; use PDOException; use Psr\Log\LoggerInterface; @@ -51,7 +52,7 @@ class SQLLoginService extends AbstractController return $datas; } - public function fetchPassword($login): array|bool + public function fetchPassword(string $login): array { try { $dbh = $this->getConnection(); @@ -71,14 +72,14 @@ class SQLLoginService extends AbstractController $this->loggerInterface->critical($e->getMessage()); throw new LoginElementsConfigurationException($e->getMessage()); } - if ($password) { - return [ - $password[$this->sqlLoginRequest->getPasswordColumnName()], - isset($password[$this->sqlLoginRequest->getSaltColumnName()]) ? $password[$this->sqlLoginRequest->getSaltColumnName()] : null, - ]; + if (!$password) { + throw new Exception('Une erreur est survenue lors de la récupération des données'); } - - return false; + + return [ + $password[$this->sqlLoginRequest->getPasswordColumnName()], + isset($password[$this->sqlLoginRequest->getSaltColumnName()]) ? $password[$this->sqlLoginRequest->getSaltColumnName()] : null, + ]; } public function getConnection(): PDO