<?php
/**
* Created by PhpStorm.
* User: zeldystern
* Date: 2021-12-22
* Time: 12:59
*/
namespace App\Security;
use App\Entity\Users;
use App\Service\JwtService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
use Symfony\Component\Security\Guard\PasswordAuthenticatedInterface;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
class AdminLoginAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
{
use TargetPathTrait;
public const LOGIN_ROUTE = 'app_admin_login';
public const LOGIN_URL = '/admin/login';
private $entityManager;
private $urlGenerator;
private $csrfTokenManager;
private $passwordEncoder;
private $logger;
private $jwtService;
public function __construct(
EntityManagerInterface $entityManager,
UrlGeneratorInterface $urlGenerator,
CsrfTokenManagerInterface $csrfTokenManager,
UserPasswordHasherInterface $passwordEncoder,
LoggerInterface $logger,
JwtService $jwtService
) {
$this->entityManager = $entityManager;
$this->urlGenerator = $urlGenerator;
$this->csrfTokenManager = $csrfTokenManager;
$this->passwordEncoder = $passwordEncoder;
$this->logger = $logger;
$this->jwtService = $jwtService;
}
public function supports(Request $request)
{
return self::LOGIN_ROUTE === $request->attributes->get('_route')
&& $request->isMethod('POST');
}
public function getCredentials(Request $request)
{
$content = $request->getContent();
if (empty($content)) {
throw new Exception("Content is empty");
}
$decoded = json_decode($content, true);
$credentials = [
'loginName' => $decoded['loginName'],
'password' => $decoded['password']
];
$request->getSession()->set(
Security::LAST_USERNAME,
$credentials['loginName']
);
return $credentials;
}
public function getUser($credentials, UserProviderInterface $userProvider)
{
$user = $this->entityManager->getRepository(Users::class)->findOneBy(['loginname' => $credentials['loginName'],'active'=>1]);
if (!$user) {
// fails authentication with a custom error
throw new CustomUserMessageAuthenticationException('Please try again');
}
return $user;
}
public function checkCredentials($credentials, UserInterface $user)
{
$passwordValid = $this->passwordEncoder->isPasswordValid(
$user,
$credentials['password'],
);
if (!$passwordValid) {
throw new CustomUserMessageAuthenticationException('Please try again - invalid password');
}
return $passwordValid;
}
/**
* Used to upgrade (rehash) the user's password automatically over time.
*/
public function getPassword($credentials): ?string
{
return $credentials['password'];
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
{
$jwt = $this->jwtService->setNewToken(
$token->getUser()->getUsername(),
$token->getRoleNames()
);
$response = new Response(
json_encode(array('id' => $token->getUser()->getId(),
'email' => $token->getUser()->getUsername(),
'firstName' => $token->getUser()->getName())),
200
);
setcookie('jwt', $jwt, time() + $_ENV['JWT_TIMEOUT'], '/', '', false, true);
setcookie('role', implode(',', $token->getRoleNames()), time() + $_ENV['JWT_TIMEOUT'], '/', '', false, false);
// setcookie('isAdmin',true,time()+60*60,'/','',false,false);
// if(in_array('ROLE_SUPER_ADMIN', $token->getRoleNames())){
// setcookie('isSuperAdmin',true,time()+60*60,'/','',false,false);
// setcookie('role','ROLE_SUPER_ADMIN',time()+60*60,'/','',false,false);
// }
return $response;
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new Response(json_encode($exception->getMessage()), 500);
}
protected function getLoginUrl()
{
return self::LOGIN_URL;
// return $this->urlGenerator->generate(self::LOGIN_ROUTE);
}
/**
* Override to control what happens when the user hits a secure page
* but isn't logged in yet.
*
*
*/
public function start(Request $request, AuthenticationException $authException = null)
{
// $url = $this->getLoginUrl();
return new Response($authException->getPrevious()->getMessage(), $authException->getPrevious()->getCode());
}
}