<?php
namespace App\Controller;
use App\Form\ResetPasswordRequestFormType;
use App\Form\ResetPasswordFormType;
use App\Repository\UsersRepository;
use App\Service\SendMailService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\Entity;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager){
$this->entityManager = $entityManager;
}
#[Route(path: '/connexion', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
#[Route(path: '/deconnexion', name: 'app_logout')]
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
#[Route(path: '/mot-de-passe-oublie', name: 'app_forgotten_password')]
public function ForgottenPassword(
Request $request,
UsersRepository $usersRepository,
TokenGeneratorInterface $tokenGeneratorInterface,
EntityManagerInterface $em,
SendMailService $sendmail
):Response
{
$resetForm=$this->createForm(ResetPasswordRequestFormType::class);
$resetForm->handleRequest($request);
if ($resetForm->isSubmitted() && $resetForm->isValid()){
$email=$resetForm->get('email')->getData();
$user = $usersRepository->findOneByEmail($email);
if ($user){
//Génération d'un token
$token=$tokenGeneratorInterface->generateToken();
$user->setResetToken($token);
$em->persist($user);
$em->flush();
//génération d'un lien de réinitialisation du mot de passe
$url = $this->generateUrl(
'app_resetpassword',
['token'=>$token],
UrlGeneratorInterface::ABSOLUTE_URL
);
$senderMail = $this->getParameter('sender_mail');
$sendmail->send(
$senderMail,
$user->getEmail(),
"Réinitilisation de mot de passe",
"passwordreset",
[
'user'=>$user,
'url' =>$url,
]
);
$this->addFlash('success','Email envoyé avec succès.');
return $this->redirectToRoute('app_login');
}
$this->addFlash('danger','Un problème est survenu.');
return $this->redirectToRoute('app_login');
};
return $this->render('security/reset_password_request.html.twig',
['resetForm' => $resetForm->createView()]);
}
#[Route(path: '/mot-de-passe-oublie/{token}', name: 'app_resetpassword')]
function ResetPassword(
string $token,
Request $request,
UsersRepository $usersRepository,
EntityManagerInterface $entityManager,
UserPasswordHasherInterface $passwordHasher
):Response{
//Vérifier si ce token est dans la base de données
$user = $usersRepository->findOneByResetToken($token);
//dd($user);
if($user){
$form = $this->createForm(ResetPasswordFormType::class);
//dd($user);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
//Effacement du TOKEN
$user->setResetToken('');
$user->setPassword(
$passwordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success','Mot de passe changé avec succès.');
return $this->redirectToRoute('app_login');
}
return $this->render('security/reset_password.html.twig',[
'passForm' => $form->createView()
]);
};
$this->addFlash('danger','Jeton invalide');
return $this->redirectToRoute('app_login');
//return $this->render('security/reset_password_request.html.twig');
}
}