<?php
namespace 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 ( ! empty($subject));
}
public function vote(TokenInterface $token, $subject, array $attributes): int
{
/** @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
{
return true;
}
}