<?php
namespace App\Controller;
use App\Form\ResetPasswordFormType;
use App\Repository\UserRepository;
use App\Service\SendMailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Form\ResetPasswordRequestFormType;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
class SecurityController extends AbstractController
{
// ================================= Route de Connection=========================================================================
#[Route(path: '/', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
// Condition qui Permet de savoir si un User est deja connecté ou pas et redirige vers sa page personnelle
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// Permet d'obtenir l'erreur de connexion s'il y en a une
$error = $authenticationUtils->getLastAuthenticationError();
// dernier nom d'utilisateur entré par l'utilisateur, pour préremplir le champ
$lastUsername = $authenticationUtils->getLastUsername();
// on retourne dans la vue, le rendu
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
}
// ================================= Route de Déconnection=========================================================================
#[Route(path: '/logout', name: 'app_logout')]
public function logout(): void
{
throw new \LogicException('Cette méthode peut être vide - elle sera interceptée par la clé de déconnexion de votre pare-feu.');
}
// ================================= Route Mot de passe oublié =========================================================================
#[Route(path: '/oubli-pass', name: 'app_forgotten_password')]
public function forgotten_password(Request $request, UserRepository $userRepository,TokenGeneratorInterface $tokenGeneratorInterface,
EntityManagerInterface $entityManager, SendMailService $mail): Response
{
$form = $this->createForm(ResetPasswordRequestFormType::class);
$form->handleRequest($request);
// on verifie que ce formulaire a été soumis et valide et voir s'il y a des erreurs
if($form->isSubmitted()&& $form->isValid()){
// on va chercher l'utilisateur par son email, pour récupéré ses datas dans le formulaire
$user = $userRepository->findOneByEmail($form->get('email')->getData());
// on vérifie si on a un user
if($user){
// on génére un token
$token = $tokenGeneratorInterface->generateToken();
$user -> setResetToken($token);
$entityManager -> persist($user);
$entityManager -> flush();
// on génére un lien de réinitialisation du mot de passe
$url = $this->generateUrl('reset_pass', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
// on crée les données du mail
$context = compact('url','user');
// on envoye le mail au user
$mail ->send(
'oops@envu2.fr',
$user->getEmail(),
'Réinitialisation du mot de passe',
'password_reset',
$context
);
$this->addFlash('success','Votre Email envoyé avec succés !');
return $this ->redirectToRoute('app_login');
}
// c'est si, on n'a pas d'utilisateur
$this->addFlash('danger','Un probléme est survenu');
return $this ->redirectToRoute('app_login');
}
return $this->render('security/reset_password_request.html.twig',[
// je crée la vue html de mon formulaire et tu la passe à la vue "requestPassForm"
'requestPassForm' => $form->createView()
]);
}
// ================================= Route Mot de passe initialisation du token =========================================================================
#[Route(path: '/oubli-pass/{token}', name: 'reset_pass')]
public function resetPass(
string $token,
Request $request, UserRepository $userRepository, EntityManagerInterface $entityManager, UserPasswordHasherInterface $userPasswordHasher
): Response
{
// on verifie si l'on a ce token dans la BDD
$user = $userRepository->findOneByResetToken($token);
if($user){
$form = $this->createForm(ResetPasswordFormType::class);
$form ->handleRequest($request);
// on verifie que ce formulaire a été soumis et valide et voir s'il y a des erreurs
if($form->isSubmitted() && $form->isValid()){
// on efface le token
$user->setResetToken('');
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$entityManager -> persist($user);
$entityManager -> flush();
$this -> addFlash('success', 'Votre mot de passe vient d\'être changer avec succés !');
return $this ->redirectToRoute('app_login');
return $this ->render('security/reset_password.html.twig',[
'passForm' => $form->createView()
]);
}
}
// si, on a un jeton non valide
$this->addFlash('danger','Jeton de connection invalide');
return $this ->redirectToRoute('app_login');
}
}