src/Security/LoginFormAuthenticator.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  11. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  12. use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
  13. use Symfony\Component\Security\Core\Security;
  14. use Symfony\Component\Security\Core\User\UserInterface;
  15. use Symfony\Component\Security\Core\User\UserProviderInterface;
  16. use Symfony\Component\Security\Csrf\CsrfToken;
  17. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  18. use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
  19. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  20. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  21. use Symfony\Component\Routing\RouterInterface;
  22. class LoginFormAuthenticator extends AbstractFormLoginAuthenticator
  23. {
  24.     use TargetPathTrait;
  25.     private $entityManager;
  26.     private $urlGenerator;
  27.     private $csrfTokenManager;
  28.     private $passwordEncoder;
  29.     private $route;
  30.     public function __construct(RouterInterface $route,EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
  31.     {
  32.         $this->entityManager = $entityManager;
  33.         $this->urlGenerator = $urlGenerator;
  34.         $this->csrfTokenManager = $csrfTokenManager;
  35.         $this->passwordEncoder = $passwordEncoder;
  36.         $this->router = $route;
  37.     }
  38.     public function supports(Request $request)
  39.     {
  40.         return 'app_login' === $request->attributes->get('_route') && $request->isMethod('POST');
  41.     }
  42.     public function getCredentials(Request $request)
  43.     {
  44.         $credentials = [
  45.             'email' => $request->request->get('email'),
  46.             'password' => $request->request->get('password'),
  47.             'csrf_token' => $request->request->get('_csrf_token'),
  48.         ];
  49.         $request->getSession()->set(
  50.             Security::LAST_USERNAME,
  51.             $credentials['email']
  52.         );
  53.         return $credentials;
  54.     }
  55.     public function getUser($credentials, UserProviderInterface $userProvider)
  56.     {
  57.         $token = new CsrfToken('authenticate', $credentials['csrf_token']);
  58.         if (!$this->csrfTokenManager->isTokenValid($token)) {
  59.             throw new InvalidCsrfTokenException();
  60.         }
  61.         $user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]);
  62.         if (!$user) {
  63.             // fail authentication with a custom error
  64.             throw new CustomUserMessageAuthenticationException("Email n'existe pas.");
  65.         }
  66.         $date_now = new \DateTime();
  67.         if(!$user->getIsEnabled()) {
  68.             // fail authentication with a custom error
  69.             throw new CustomUserMessageAuthenticationException('Votre compte est désactivé.');
  70.         }
  71.         if($user->getIsArchived()) {
  72.             // fail authentication with a custom error
  73.             throw new CustomUserMessageAuthenticationException('Votre compte est supprimé.');
  74.         }
  75.         return $user;
  76.     }
  77.     public function checkCredentials($credentials, UserInterface $user)
  78.     {
  79.         return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
  80.     }
  81.     public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
  82.     {
  83.         if ($request->hasSession()) {
  84.             if($exception->getMessage() == 'Authentication failed because App\Security\LoginFormAuthenticator::checkCredentials() did not return true.')
  85.                 $request->getSession()->set(Security::AUTHENTICATION_ERROR, new CustomUserMessageAuthenticationException('Mot de passe invalide.'));
  86.             else
  87.                 $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);
  88.         }
  89.         if ($request->isXmlHttpRequest()) {
  90.             $rep =array(
  91.                 'redirect'=>'',
  92.                 'success'=>false,
  93.                 'erreur'=>$exception->getMessage() == 'Authentication failed because App\Security\LoginFormAuthenticator::checkCredentials() did not return true.' ? 'Mot de passe invalide.':$exception->getMessage(),
  94.             );
  95.             $response = new Response();
  96.             $response->setContent(json_encode($rep));
  97.             $response->setStatusCode(200);
  98.             return $response;
  99.         }
  100.         $url = $this->urlGenerator->generate('app_login');
  101.         if('app_login' === $request->attributes->get('_route')) {
  102.             $url = $this->urlGenerator->generate('app_login');
  103.         }
  104.         return new RedirectResponse($url);
  105.     }
  106.     public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
  107.     {
  108.         $Roles = $token->getUser()->getRoles();
  109.         $user = $token->getUser();
  110.         $user->setDerniereConnecxion(new \DateTime('now',new \DateTimeZone('Europe/Paris')));
  111.         $this->entityManager->persist($user);
  112.         $this->entityManager->flush();
  113.         if (in_array("ROLE_SUPER_ADMINISTRATOR", $Roles) or in_array("ROLE_ADMIN", $Roles)){
  114.             return new RedirectResponse($this->urlGenerator->generate('admin_project_list_home'));
  115.         }else if (in_array("ROLE_DEV", $Roles) or in_array("ROLE_EPC", $Roles) or in_array("ROLE_RESPONSABLE", $Roles) or  in_array("ROLE_RESPONSABLE_DEVELOPPEMENT", $Roles) or in_array("ROLE_CONSTRUCTEUR", $Roles)){
  116.             return new RedirectResponse($this->urlGenerator->generate('user_project_view'));
  117.         } else if (in_array("ROLE_GESTION_FINANCIER", $Roles)){
  118.             return new RedirectResponse($this->urlGenerator->generate('admin_project_list_home'));
  119.         } else if (in_array("ROLE_OPERATEUR_FINANCIER", $Roles)){
  120.             return new RedirectResponse($this->urlGenerator->generate('admin_facture_finance_liste'));
  121.         } else if (in_array("ROLE_DEVELOPPEMENT_ANALYSTE", $Roles) or in_array("ROLE_ANALYSTE", $Roles) or in_array("ROLE_ASSET_MANAGER", $Roles) or in_array("ROLE_COMPTABLE", $Roles) or in_array("ROLE_ADMINISTRATEUR_FINANCIER", $Roles)){
  122.             return new RedirectResponse($this->urlGenerator->generate('admin_facture_finance_liste'));
  123.         } else if (in_array("ROLE_AUDITEUR", $Roles)){
  124.             return new RedirectResponse($this->urlGenerator->generate('admin_project_list_home'));
  125.         } else if (in_array("ROLE_MAITRE_OEUVRE", $Roles) or in_array("ROLE_AMO", $Roles) or in_array("ROLE_MACON", $Roles) or in_array("ROLE_CONSTRUCTEUR", $Roles) or in_array("ROLE_CHARPENTIER", $Roles) or in_array("ROLE_ELECTRICIEN", $Roles) or in_array("ROLE_POSEUR", $Roles) ){
  126.             return new RedirectResponse($this->urlGenerator->generate('intervenant_project_view'));
  127.         } else if (in_array("ROLE_FOURNISSEUR", $Roles)){
  128.             return new RedirectResponse($this->urlGenerator->generate('intervenant_project_view'));
  129.         }
  130.         if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
  131.             return new RedirectResponse($targetPath);
  132.         }
  133.         // For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
  134.         throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
  135.     }
  136.     protected function getLoginUrl()
  137.     {
  138.         return $this->urlGenerator->generate('app_login');
  139.     }
  140. }