src/Controller/SecurityController.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Form\ResetPasswordForm;
  4. use App\Form\ResetPasswordRequestForm;
  5. use App\Security\LoginAPIAuthenticator;
  6. use App\Security\UserProvider;
  7. use App\Services\UlteamApiService;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\Form\Extension\Core\Type\TextType;
  10. use Symfony\Component\HttpFoundation\RedirectResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  15. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  16. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  17. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  18. use Symfony\Component\Security\Http\SecurityEvents;
  19. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  20. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  21. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  22. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  23. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  24. class SecurityController extends AbstractController
  25. {
  26.     
  27.     /**
  28.      * @Route("/login/{slug}", name="app_login")
  29.      * @param AuthenticationUtils $authenticationUtils
  30.      * @return Response
  31.      */
  32.     public function login(AuthenticationUtils $authenticationUtils$slug ''): Response
  33.     {
  34.         $token = [];
  35.         // get the login error if there is one
  36.         $error $authenticationUtils->getLastAuthenticationError();
  37.         // last username entered by the user hydra:member
  38.         $lastUsername $authenticationUtils->getLastUsername();
  39.         $form $this->createForm(ResetPasswordRequestForm::class, null, ['action' => $this->generateUrl('app_reset_pwd_request')]);
  40.         if (isset($_GET['token'])) {
  41.             $token['token'] = $_GET['token'];
  42.         }elseif ($this->getUser()!= null){
  43.             $token['token'] = $this->getUser()->getToken();
  44.         }
  45.         $passwordResetForm $this->createForm(ResetPasswordForm::class, $token, ['action' => $this->generateUrl('app_reset_pwd', ['token'=>$token])]);
  46.         return $this->render('security/login.html.twig', [
  47.             'last_username' => $lastUsername,
  48.             'error' => $error,
  49.             'reset_request_form' => $form->createView(),
  50.             'reset_pwd_form' => $passwordResetForm->createView(),
  51.             'token' => $token,
  52.             'slug' => $slug
  53.         ]);
  54.     }
  55.     /**
  56.      * @param Request $request
  57.      * @param UlteamApiService $apiService
  58.      * @return RedirectResponse
  59.      * @Route("/reset-pwd-request", name="app_reset_pwd_request")
  60.      */
  61.     public function resetPasswordRequest(Request $requestUlteamApiService $apiService): RedirectResponse
  62.     {
  63.         $form $this->createForm(ResetPasswordRequestForm::class, null, ['action' => $this->generateUrl('app_reset_pwd_request')]);
  64.         $form->handleRequest($request);
  65.         if ($form->isSubmitted() && $form->isValid()){
  66.             try {
  67.                 $message $apiService->resetPwdRequest($form->get('email')->getData())->message;
  68.                 $this->addFlash('warning'$message);
  69.             } catch (ClientExceptionInterface TransportExceptionInterface ServerExceptionInterface RedirectionExceptionInterface $e) {
  70.                 $this->addFlash('error'"Une erreur est survenue, nous ne pouvons pas traiter votre demande");
  71.             }
  72.         }
  73.         return $this->redirectToRoute('app_login');
  74.     }
  75.     /**
  76.      * @param Request $request
  77.      * @param UlteamApiService $apiService
  78.      * @return RedirectResponse
  79.      * @Route("/reset-pwd", name="app_reset_pwd")
  80.      */
  81.     public function resetPassword(Request $requestUlteamApiService $apiServiceTokenStorageInterface $storageUserProvider $providerEventDispatcherInterface $dispatcherLoginAPIAuthenticator $authenticator):Response
  82.     {
  83.         $error= [];
  84.         $errorsFiltered = [];
  85.         if ($_GET != []) {
  86.             $token['token'] = $_GET['token'];
  87.         }else{
  88.             $token['token'] = $this->getUser()->getToken();
  89.         }
  90.         $passwordResetForm $this->createForm(ResetPasswordForm::class, $token);
  91.         if ($this->getUser() != null && $this->getUser()->getIsFirstLogin() == true) {
  92.             $passwordResetForm->add('username'TextType::class,["label" => 'Identifiant']);
  93.         }
  94.         $passwordResetForm->handleRequest($request);
  95.         if ($passwordResetForm->isSubmitted() && $passwordResetForm->isValid()){
  96.             try {
  97.                 $data $passwordResetForm ->getData();
  98.                 if ($this->getUser() != null && $this->getUser()->getIsFirstLogin() == true) {
  99.                     $user $apiService->getUser($this->getUser()->getId());
  100.                     if (isset($user->department)) {
  101.                         $user->department $user->department->{"@id"};
  102.                     }
  103.                     unset($data['token']);
  104.                     $user->firstLogin false;
  105.                     $user->{'username'} = $data['username'];
  106.                     $user->{'plainPassword'} = $data['password'];
  107.                     $user->{'passwordConfirm'} = $data['passwordConfirmation'];
  108.                     $updatedUser $apiService->updateUser($user);
  109.                     // Login after password change
  110.                     $storage->setToken();
  111.                     $user $provider->loadUserByUsername($updatedUser->username$passwordResetForm->get('password')->getData());
  112.                     $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  113.                     $storage->setToken($token);
  114.                     $event = new InteractiveLoginEvent($request$token);
  115.                     $dispatcher->dispatch($eventSecurityEvents::INTERACTIVE_LOGIN);
  116.                     $response $authenticator->onAuthenticationSuccess($request$token'main');
  117.                     $this->addFlash('success''Informations modifiées avec succès');
  118.                     return $response;
  119.                 }
  120.                 $apiService->resetPwd($data);
  121.                 $this->addFlash('success''Mot de passe modifié avec succès');
  122.                 return $this->redirectToRoute("app_login");
  123.             } catch (ClientExceptionInterface TransportExceptionInterface ServerExceptionInterface RedirectionExceptionInterface $e) {
  124.                 $error json_decode($e->getResponse()->getContent(false))->violations;
  125.                 foreach ($error as $value) {
  126.                     $errorsFiltered['message'] = $value->{'message'};
  127.                 }
  128.                 $error json_decode(json_encode($errorsFiltered));
  129.                 $this->addFlash('danger'$error->message);
  130.                 $referer $request->headers->get('referer');
  131.                 return $this->redirect($referer);
  132.             }
  133.         }
  134.         return $this->render('security/reset_pwd.html.twig', [
  135.             'error' => $error,
  136.             'reset_pwd_form' => $passwordResetForm->createView(),
  137.             'token' => $token,
  138.         ]);
  139.     }
  140.     /**
  141.      * @Route("/logout", name="app_logout")
  142.      */
  143.     public function logout()
  144.     {
  145.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  146.     }
  147. }