src/Security/AdminLoginAuthenticator.php line 33

Open in your IDE?
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: zeldystern
  5. * Date: 2021-12-22
  6. * Time: 12:59
  7. */
  8. namespace App\Security;
  9. use App\Entity\Users;
  10. use App\Service\JwtService;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Psr\Log\LoggerInterface;
  13. use Symfony\Component\Config\Definition\Exception\Exception;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  19. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  20. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  21. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  22. use Symfony\Component\Security\Core\Security;
  23. use Symfony\Component\Security\Core\User\UserInterface;
  24. use Symfony\Component\Security\Core\User\UserProviderInterface;
  25. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  26. use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
  27. use Symfony\Component\Security\Guard\PasswordAuthenticatedInterface;
  28. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  29. class AdminLoginAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
  30. {
  31. use TargetPathTrait;
  32. public const LOGIN_ROUTE = 'app_admin_login';
  33. public const LOGIN_URL = '/admin/login';
  34. private $entityManager;
  35. private $urlGenerator;
  36. private $csrfTokenManager;
  37. private $passwordEncoder;
  38. private $logger;
  39. private $jwtService;
  40. public function __construct(
  41. EntityManagerInterface $entityManager,
  42. UrlGeneratorInterface $urlGenerator,
  43. CsrfTokenManagerInterface $csrfTokenManager,
  44. UserPasswordHasherInterface $passwordEncoder,
  45. LoggerInterface $logger,
  46. JwtService $jwtService
  47. ) {
  48. $this->entityManager = $entityManager;
  49. $this->urlGenerator = $urlGenerator;
  50. $this->csrfTokenManager = $csrfTokenManager;
  51. $this->passwordEncoder = $passwordEncoder;
  52. $this->logger = $logger;
  53. $this->jwtService = $jwtService;
  54. }
  55. public function supports(Request $request)
  56. {
  57. return self::LOGIN_ROUTE === $request->attributes->get('_route')
  58. && $request->isMethod('POST');
  59. }
  60. public function getCredentials(Request $request)
  61. {
  62. $content = $request->getContent();
  63. if (empty($content)) {
  64. throw new Exception("Content is empty");
  65. }
  66. $decoded = json_decode($content, true);
  67. $credentials = [
  68. 'loginName' => $decoded['loginName'],
  69. 'password' => $decoded['password']
  70. ];
  71. $request->getSession()->set(
  72. Security::LAST_USERNAME,
  73. $credentials['loginName']
  74. );
  75. return $credentials;
  76. }
  77. public function getUser($credentials, UserProviderInterface $userProvider)
  78. {
  79. $user = $this->entityManager->getRepository(Users::class)->findOneBy(['loginname' => $credentials['loginName'],'active'=>1]);
  80. if (!$user) {
  81. // fails authentication with a custom error
  82. throw new CustomUserMessageAuthenticationException('Please try again');
  83. }
  84. return $user;
  85. }
  86. public function checkCredentials($credentials, UserInterface $user)
  87. {
  88. $passwordValid = $this->passwordEncoder->isPasswordValid(
  89. $user,
  90. $credentials['password'],
  91. );
  92. if (!$passwordValid) {
  93. throw new CustomUserMessageAuthenticationException('Please try again - invalid password');
  94. }
  95. return $passwordValid;
  96. }
  97. /**
  98. * Used to upgrade (rehash) the user's password automatically over time.
  99. */
  100. public function getPassword($credentials): ?string
  101. {
  102. return $credentials['password'];
  103. }
  104. public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
  105. {
  106. $jwt = $this->jwtService->setNewToken(
  107. $token->getUser()->getUsername(),
  108. $token->getRoleNames()
  109. );
  110. $response = new Response(
  111. json_encode(array('id' => $token->getUser()->getId(),
  112. 'email' => $token->getUser()->getUsername(),
  113. 'firstName' => $token->getUser()->getName())),
  114. 200
  115. );
  116. setcookie('jwt', $jwt, time() + $_ENV['JWT_TIMEOUT'], '/', '', false, true);
  117. setcookie('role', implode(',', $token->getRoleNames()), time() + $_ENV['JWT_TIMEOUT'], '/', '', false, false);
  118. // setcookie('isAdmin',true,time()+60*60,'/','',false,false);
  119. // if(in_array('ROLE_SUPER_ADMIN', $token->getRoleNames())){
  120. // setcookie('isSuperAdmin',true,time()+60*60,'/','',false,false);
  121. // setcookie('role','ROLE_SUPER_ADMIN',time()+60*60,'/','',false,false);
  122. // }
  123. return $response;
  124. }
  125. public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
  126. {
  127. return new Response(json_encode($exception->getMessage()), 500);
  128. }
  129. protected function getLoginUrl()
  130. {
  131. return self::LOGIN_URL;
  132. // return $this->urlGenerator->generate(self::LOGIN_ROUTE);
  133. }
  134. /**
  135. * Override to control what happens when the user hits a secure page
  136. * but isn't logged in yet.
  137. *
  138. *
  139. */
  140. public function start(Request $request, AuthenticationException $authException = null)
  141. {
  142. // $url = $this->getLoginUrl();
  143. return new Response($authException->getPrevious()->getMessage(), $authException->getPrevious()->getCode());
  144. }
  145. }