<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
class LoginAuthenticator extends AbstractLoginFormAuthenticator
{
use TargetPathTrait;
public const LOGIN_ROUTE = 'app_login';
public function __construct(private UrlGeneratorInterface $urlGenerator)
{
}
public function authenticate(Request $request): Passport
{
$email = $request->request->get('email', '');
$request->getSession()->set(Security::LAST_USERNAME, $email);
return new Passport(
new UserBadge($email),
new PasswordCredentials($request->request->get('password', '')),
[
new CsrfTokenBadge('authenticate', $request->request->get('_csrf_token')), ]
);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
{
if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
$targetPathUrl = (string) parse_url($targetPath, PHP_URL_PATH);
$blockedTargets = [
'/produits/produitsepuises',
'/new_produits/produits_epuises',
'/api',
];
$isBlockedTarget = false;
foreach ($blockedTargets as $blockedTarget) {
if ($targetPathUrl === $blockedTarget || str_starts_with($targetPathUrl, $blockedTarget . '/')) {
$isBlockedTarget = true;
break;
}
}
if (!$isBlockedTarget) {
return new RedirectResponse($targetPath);
}
$this->removeTargetPath($request->getSession(), $firewallName);
}
$roles = $token->getUser()->getRoles();
if (
in_array('ROLE_ADMIN', $roles) ||
in_array('ROLE_ULTRATEX', $roles) ||
in_array('ROLE_ULTRACONFECTION', $roles) ||
in_array('ROLE_GESTION_STOCK', $roles) ||
in_array('ROLE_RH', $roles)
) {
return new RedirectResponse($this->urlGenerator->generate('app_home'));
}
else{
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
// return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
protected function getLoginUrl(Request $request): string
{
return $this->urlGenerator->generate(self::LOGIN_ROUTE);
}
}