src/Controller/SecurityController.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Events\Events;
  5. use App\Form\PwdType;
  6. use App\Form\ResetPwdType;
  7. use App\Service\JwtHandler;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  10. use KnpU\OAuth2ClientBundle\Client\Provider\KeycloakClient;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  13. use Symfony\Component\EventDispatcher\GenericEvent;
  14. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  15. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  21. use Symfony\Component\Security\Core\Exception\BadCredentialsException;
  22. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  23. use Symfony\Component\Validator\Constraints\IsTrue;
  24. class SecurityController extends AbstractController
  25. {
  26.     /**
  27.      * @Route("/login", name="app_login")
  28.      */
  29.     public function login(AuthenticationUtils $authenticationUtilsClientRegistry $clientRegistry): Response
  30.     {
  31.         // Si le visiteur est déjà identifié, on le redirige
  32.         if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  33.             return $this->redirectToRoute('user_dashboard');
  34.         }
  35.             //TODO redirection vers keycloak
  36. //        /** @var KeycloakClient $client */
  37. //        $client = $clientRegistry->getClient('keycloak');
  38. //        return $client->redirect(['openid','kinalgo-user']);
  39.         // get the login error if there is one
  40.         $error $authenticationUtils->getLastAuthenticationError();
  41.         /*Custom message error if bad credential*/
  42.         if ($error instanceof BadCredentialsException) {
  43.             $error = new \stdClass();
  44.             $error->message 'Email ou mot de passe non valide';
  45.         }
  46.         // last username entered by the user
  47.         $lastUsername $authenticationUtils->getLastUsername();
  48.         return $this->render('security/screen/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  49.     }
  50.     /**
  51.      * @Route("/open-id/check-auth", name="openid_check_auth")
  52.      */
  53.     public function redirectUri(){}
  54.     /**
  55.      * @Route("/logout", name="logout", methods={"GET"})
  56.      */
  57.     public function logout()
  58.     {
  59.         // controller can be blank: it will never be executed!
  60.         throw new \Exception('Don\'t forget to activate logout in security.yaml');
  61.     }
  62.     /**
  63.      * Envoie d'un email pour réinitialisation mot de passe ou création de compte
  64.      * @Route("/security/password/{context}", requirements={"context":"reset|create"}, name="security-reset",methods={"POST","GET"})
  65.      */
  66.     public function reset(Request $requeststring $contextEventDispatcherInterface $eventDispatcher,ManagerRegistry $em)
  67.     {
  68.         /*Create form*/
  69.         $form $this->createFormBuilder()
  70.             ->add('email'EmailType::class, array('required' => true'label' => false,
  71.                 'attr' => array('class' => 'user-form__input')))
  72.             ->getForm();
  73.         $form->handleRequest($request);
  74.         /*form is submitted*/
  75.         if ($form->isSubmitted() && $form->isValid()) {
  76.             $data $form->getData();
  77.             //check email
  78.             /* @var $user User*/
  79.             $user $em->getRepository(User::class)->findOneBy(['email' => $data['email']]);
  80.             if (!$user || empty($user)) {
  81.                 $this->addFlash('notice-warning''Aucun compte associé à cet email n\'a été trouvé.');
  82.                 return $this->redirectToRoute('security-reset',["context"=>$context]);
  83.             }
  84.             if($context === 'reset' && $user->getPassword() === null){
  85.                 $createPassHref $this->generateUrl('security-reset',['context'=>'create']);
  86.                 $link "<a class='text-decoration-underline' href='{$createPassHref}'>Créer mon compte maintenant</a>";
  87.                 $message sprintf('Vous ne pouvez pas réinitialiser votre mot de passe car votre compte n’est pas encore finalisé. Cliquez sur %s ou contactez le référent prévention de votre établissement.',$link);
  88.                 $this->addFlash('notice-warning'$message);
  89.                 return $this->redirectToRoute('security-reset',["context"=>$context]);
  90.             }
  91.             if($context === 'create' && $user->getPassword() !== null){
  92.                 $forgotPassHref $this->generateUrl('security-reset',['context'=>'reset']);
  93.                 $link "<a class='text-decoration-underline' href='{$forgotPassHref}'>mot de passe oublié</a>";
  94.                 $message sprintf('Vous avez déjà créé votre mot de passe. Cliquez sur %s pour le réinitialiser.',$link);
  95.                 $this->addFlash('notice-warning'$message);
  96.                 return $this->redirectToRoute('security-reset',["context"=>$context]);
  97.             }
  98.             /*==============>Email exist*/
  99.             $event = new GenericEvent(['user'=>$user,'context'=>$context]);
  100.             $eventDispatcher->dispatch($eventEvents::EMAIL_FORGOT_PWD);
  101.             $message $context === "reset" "Un email a été envoyé a l'adresse {$user->getEmail()}, suivez le lien pour changer votre mot de passe." :
  102.                 "Un email a été envoyé a l'adresse {$user->getEmail()}, suivez le lien pour créer votre mot de passe.";
  103.             $this->addFlash('notice-success'$message);
  104.             return $this->redirectToRoute('app_login', array(
  105.                     'last_username' => $user->getEmail(),
  106.                 )
  107.             );
  108.         }
  109.         return $this->render('security/screen/reset.html.twig', array(
  110.             'form' => $form->createView(),
  111.             'title_page' => $context === 'reset' 'Mot de passe oublié' "Création de compte",
  112.             'context' => $context
  113.         ));
  114.     }
  115.     /**
  116.      * @Route("/reset-password/{user}", name="reset-password", methods={"GET", "POST"})
  117.      */
  118.     public function resetPassword(Request $requestUser $userJwtHandler $jwtUserPasswordHasherInterface $encoder,ManagerRegistry $managerRegistry)
  119.     {
  120.         $token $request->query->get('token');
  121.         $decoded $jwt->verifyToken($token);
  122.         if (!$decoded || !$jwt->verifyUserToken($user->getId(), $decoded)) {
  123.             throw $this->createAccessDeniedException();
  124.         }
  125.         $form $this->createForm(PwdType::class, $user);
  126.         $form->handleRequest($request);
  127.         if ($form->isSubmitted() && $form->isValid()) {
  128.             $encoded $encoder->hashPassword($user$user->getPlainPassword());
  129.             $user->setPassword($encoded);
  130.             $entityManager $managerRegistry->getManager();
  131.             $entityManager->persist($user);
  132.             $entityManager->flush();
  133.             $this->addFlash('notice-success'"Votre mot de passe a été créé, vous pouvez vous connecter.");
  134.             return $this->redirectToRoute('app_login');
  135.         }
  136.         return $this->render('security/screen/reset-pwd.html.twig', array(
  137.             'form' => $form->createView(),
  138.             'title_page' => 'Réinitialisation du mot de passe'
  139.         ));
  140.     }
  141.     /**
  142.      * @Route("/create-account/{user}", name="create-account", methods={"GET", "POST"})
  143.      */
  144.     public function createAccount(Request $requestUser $userJwtHandler $jwtUserPasswordHasherInterface $encoderManagerRegistry $managerRegistry)
  145.     {
  146.         $token $request->query->get('token');
  147.         $decoded $jwt->verifyToken($token);
  148.         if (
  149.             !$decoded || !$jwt->verifyUserToken($user->getId(), $decoded) ||
  150.             $user->getPassword() // déjà un compte avec mot de passe
  151.         ) {
  152.             throw $this->createAccessDeniedException();
  153.         }
  154.         $form $this->createForm(PwdType::class, $user)
  155.             ->add('agreeTerms'CheckboxType::class, [
  156.                 'label' =>false,
  157.                 'label_html' => true,
  158.                 'mapped' => false,
  159.                 'constraints' => [
  160.                     new IsTrue([
  161.                         'message' => 'Vous devez accepter les conditions générales.',
  162.                     ]),
  163.                 ],
  164.                 'required' => true,
  165.             ]);
  166.         $form->handleRequest($request);
  167.         if ($form->isSubmitted() && $form->isValid()) {
  168.             $encoded $encoder->hashPassword($user$user->getPlainPassword());
  169.             $user->setPassword($encoded);
  170.             $user->setCgu(true);
  171.             $user->setAgreeTermsAt(new \DateTime("now", new \DateTimeZone("Europe/Paris")));
  172.             $entityManager $managerRegistry->getManager();
  173.             $entityManager->persist($user);
  174.             $entityManager->flush();
  175.             $this->addFlash('notice-success'"Votre mot de passe a été créé, vous pouvez vous connecter.");
  176.             return $this->redirectToRoute('app_login');
  177.         }
  178.         return $this->render('security/screen/create-account.html.twig', array(
  179.             'form' => $form->createView(),
  180.             'title_page' => 'Création du mot de passe'
  181.         ));
  182.     }
  183. }