<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Repository\UserRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\BodyRendererInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Form\ResetPasswordRequestFormType;
use App\Form\ResetPasswordFormType;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class SecurityController extends AbstractController
{
/**
* @Route("/connexion", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getlastUsername();
return $this->render('registration/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
}
/**
* @Route("/deconnection", name="app_logout")
*/
public function logout()
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/oublie-passe", name="app_forgotten_password")
*/
public function forgottenPassword(Request $request, UserRepository $userRepository, TokenGeneratorInterface $tokenGenerator, ManagerRegistry $doctrine, MailerInterface $mailer) : Response
{
$form = $this->createForm(ResetPasswordRequestFormType::class);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
//On va chercher l'utilisateur par son email
$user = $userRepository->findOneByEmail($form->get('email')->getData());
// On vérifie si on a un utilisateur
if($user){
// On génère un token de réinitialisation
$token = $tokenGenerator->generateToken();
$user->setResetToken($token);
$doctrine->getManager()->persist($user);
$doctrine->getManager()->flush();
// On génère un lien de réinitialisation du mot de passe
$url = $this->generateUrl('app_reset_pass', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
// Envoi du mail
$email = (new TemplatedEmail())
->from('[email protected]')
->to($user->getEmail())
->subject('Votre demande de mot de passe')
// path of the Twig template to render
// ->htmlTemplate('emails/signup.html.twig')
->htmlTemplate('emails/lost-password.html.twig')
// pass variables (name => value) to the template
->context([
'url' => $url,
'user' => $user,
])
;
$mailer->send($email);
$this->addFlash('success', 'Email envoyé avec succès');
return $this->redirectToRoute('app_login');
}
// $user est null
$this->addFlash('danger', 'Un problème est survenu');
return $this->redirectToRoute('app_login');
}
return $this->render('security/reset_password_request.html.twig', [
'requestPassForm' => $form->createView(),
]);
}
/**
* @Route("/oublie-passe/{token}", name="app_reset_pass")
*/
public function resetPassstring ($token, Request $request, UserRepository $userRepository, ManagerRegistry $doctrine, UserPasswordHasherInterface $passwordHasher): Response
{
// On vérifie si on a ce token dans la base
$user = $userRepository->findOneByResetToken($token);
// On vérifie si l'utilisateur existe
if($user) {
$form = $this->createForm(ResetPasswordFormType::class);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
// On efface le token
$user->setResetToken('');
// On enregistre le nouveau mot de passe en le hashant
$user->setPassword(
$passwordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$doctrine->getManager()->persist($user);
$doctrine->getManager()->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(),
'user' => $user,
]);
} else {
// Si le token est invalide on redirige vers le login
$this->addFlash('danger', 'Vous n\'êtes pas autorisé à accéder à ce lien');
return $this->redirectToRoute('app_login');
}
}
}