src/Security/AppAuthenticator.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\SyncToken;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Security;
  11. use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  17. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  18. use Symfony\Component\HttpFoundation\Cookie;
  19. class AppAuthenticator extends AbstractLoginFormAuthenticator
  20. {
  21. use TargetPathTrait;
  22. public const LOGIN_ROUTE = 'app_login';
  23. public function __construct(
  24. private UrlGeneratorInterface $urlGenerator,
  25. private EntityManagerInterface $em, // ← ajouter
  26. ) {}
  27. public function authenticate(Request $request): Passport
  28. {
  29. $username = $request->request->get('username', '');
  30. $request->getSession()->set(Security::LAST_USERNAME, $username);
  31. return new Passport(
  32. new UserBadge($username),
  33. new PasswordCredentials($request->request->get('password', '')),
  34. [
  35. new CsrfTokenBadge('authenticate', $request->request->get('_csrf_token')),
  36. new RememberMeBadge(),
  37. ]
  38. );
  39. }
  40. public function onAuthenticationSuccess(
  41. Request $request,
  42. TokenInterface $token,
  43. string $firewallName
  44. ): ?Response {
  45. $user = $token->getUser();
  46. // ── Générer SyncToken ─────────────────────────────────────────────
  47. $ancienToken = $this->em->getRepository(SyncToken::class)
  48. ->findOneBy(['user' => $user]);
  49. if ($ancienToken) {
  50. $this->em->remove($ancienToken);
  51. $this->em->flush();
  52. }
  53. $syncToken = new SyncToken();
  54. $syncToken->setUser($user);
  55. $this->em->persist($syncToken);
  56. $this->em->flush();
  57. // ── Redirection ───────────────────────────────────────────────────
  58. if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
  59. $response = new RedirectResponse($targetPath);
  60. } else {
  61. $response = new RedirectResponse(
  62. $this->urlGenerator->generate('mstope_intranet_index')
  63. );
  64. }
  65. // ── Cookie sync_token ─────────────────────────────────────────────
  66. $response->headers->setCookie(
  67. Cookie::create('sync_token')
  68. ->withValue($syncToken->getToken())
  69. ->withExpires(new \DateTime('+90 days'))
  70. ->withPath('/')
  71. ->withSecure(true)
  72. ->withHttpOnly(false)
  73. ->withSameSite('strict')
  74. );
  75. return $response;
  76. }
  77. protected function getLoginUrl(Request $request): string
  78. {
  79. return $this->urlGenerator->generate(self::LOGIN_ROUTE);
  80. }
  81. }