<?phpnamespace App\Security\Voter;use App\Entity\Utilisateur\Droit;use App\Entity\Utilisateur\Utilisateur;use Psr\Log\LoggerInterface;use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;use Symfony\Component\Security\Core\Authorization\Voter\Voter;class EntityVoter extends Voter{ public const SESSION_KEY = 'droit'; public const SHOW = 'voir'; public const ADD = 'ajouter'; public const UPDATE = 'modifier'; public const DELETE = 'supprimer'; public const EXPORT = 'exporter'; private RequestStack $requestStack; private LoggerInterface $logger; private ParameterBagInterface $parameterBag; public function __construct(RequestStack $requestStack, LoggerInterface $securityLogger, ParameterBagInterface $parameterBag) { $this->requestStack = $requestStack; $this->logger = $securityLogger; $this->parameterBag = $parameterBag; } protected function supports(string $attribute, $subject): bool { //return true; return (!empty($subject)); } /* public function vote(TokenInterface $token, $subject, array $attributes): int { dump('test'); /** @var ?Utilisateur $user *//* $user = $token->getUser(); if ($user === null) { return self::ACCESS_ABSTAIN; } $entityFounded = false; /** @var Droit[] $droits *//* $droits = $this->requestStack->getSession()->get(self::SESSION_KEY); if (is_string($subject) && class_exists($subject)) { $objectClassName = $subject; } elseif (is_object($subject)) { $objectClassName = get_class($subject); } else { $this->logger->error('This entity doesn\'t exist : '.$subject); if($this->parameterBag->get('kernel.debug') === true) {// throw new \Exception('This entity doesn\'t exist : '.$subject); } return self::ACCESS_ABSTAIN; } foreach ($attributes as $attribute) { if ($droits !== null) { foreach ($droits as $line) { if ($line->getEntite() === $objectClassName) { $entityFounded = true; if ($attribute === self::SHOW && $line->getVoir() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::ADD && $line->getAjouter() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::UPDATE && $line->getModifier() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::DELETE && $line->getSupprimer() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::EXPORT && $line->getExporter() === true) { return self::ACCESS_GRANTED; } } } } } if ( ! $entityFounded) { if($this->parameterBag->get('kernel.debug') === true) {// throw new \Exception('This entity not found in rights : '.$objectClassName); } $this->logger->warning('This entity not found in rights : '.$objectClassName); } return self::ACCESS_ABSTAIN; }*/ protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool { /** @var ?Utilisateur $user */ $user = $token->getUser(); if ($user === null) { return self::ACCESS_ABSTAIN; } $entityFounded = false; /** @var Droit[] $droits */ $droits = $this->requestStack->getSession()->get(self::SESSION_KEY); if (is_string($subject) && class_exists($subject)) { $objectClassName = $subject; } elseif (is_object($subject)) { $objectClassName = get_class($subject); } else { $this->logger->error('This entity doesn\'t exist : '.$subject); if($this->parameterBag->get('kernel.debug') === true) {// throw new \Exception('This entity doesn\'t exist : '.$subject); } return self::ACCESS_ABSTAIN; } $attributes = [$attribute]; foreach ($attributes as $attribute) { if ($droits !== null) { foreach ($droits as $line) { if ($line->getEntite() === $objectClassName) { $entityFounded = true; if ($attribute === self::SHOW && $line->getVoir() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::ADD && $line->getAjouter() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::UPDATE && $line->getModifier() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::DELETE && $line->getSupprimer() === true) { return self::ACCESS_GRANTED; } elseif ($attribute === self::EXPORT && $line->getExporter() === true) { return self::ACCESS_GRANTED; } } } } } if ( ! $entityFounded) { if($this->parameterBag->get('kernel.debug') === true) {// throw new \Exception('This entity not found in rights : '.$objectClassName); } $this->logger->warning('This entity not found in rights : '.$objectClassName); } return self::ACCESS_ABSTAIN; }}