src/Security/Voter/EntityVoter.php line 13

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Utilisateur\Droit;
  4. use App\Entity\Utilisateur\Utilisateur;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. class EntityVoter extends Voter
  11. {
  12.     public const SESSION_KEY 'droit';
  13.     public const SHOW 'voir';
  14.     public const ADD 'ajouter';
  15.     public const UPDATE 'modifier';
  16.     public const DELETE 'supprimer';
  17.     public const EXPORT 'exporter';
  18.     private RequestStack $requestStack;
  19.     private LoggerInterface $logger;
  20.     private ParameterBagInterface $parameterBag;
  21.     public function __construct(RequestStack $requestStackLoggerInterface $securityLoggerParameterBagInterface $parameterBag)
  22.     {
  23.         $this->requestStack $requestStack;
  24.         $this->logger       $securityLogger;
  25.         $this->parameterBag $parameterBag;
  26.     }
  27.     protected function supports(string $attribute$subject): bool
  28.     {
  29.         return ( ! empty($subject));
  30.     }
  31.     public function vote(TokenInterface $token$subject, array $attributes): int
  32.     {
  33.         /** @var ?Utilisateur $user */
  34.         $user $token->getUser();
  35.         if ($user === null) {
  36.             return self::ACCESS_ABSTAIN;
  37.         }
  38.         $entityFounded false;
  39.         /** @var Droit[] $droits */
  40.         $droits $this->requestStack->getSession()->get(self::SESSION_KEY);
  41.         if (is_string($subject) && class_exists($subject)) {
  42.             $objectClassName $subject;
  43.         } elseif (is_object($subject)) {
  44.             $objectClassName get_class($subject);
  45.         } else {
  46.             $this->logger->error('This entity doesn\'t exist : '.$subject);
  47.             if($this->parameterBag->get('kernel.debug') === true) {
  48. //                throw new \Exception('This entity doesn\'t exist : '.$subject);
  49.             }
  50.             return self::ACCESS_ABSTAIN;
  51.         }
  52.         foreach ($attributes as $attribute) {
  53.             if ($droits !== null) {
  54.                 foreach ($droits as $line) {
  55.                     if ($line->getEntite() === $objectClassName) {
  56.                         $entityFounded true;
  57.                         if ($attribute === self::SHOW && $line->getVoir() === true) {
  58.                             return self::ACCESS_GRANTED;
  59.                         } elseif ($attribute === self::ADD && $line->getAjouter() === true) {
  60.                             return self::ACCESS_GRANTED;
  61.                         } elseif ($attribute === self::UPDATE && $line->getModifier() === true) {
  62.                             return self::ACCESS_GRANTED;
  63.                         } elseif ($attribute === self::DELETE && $line->getSupprimer() === true) {
  64.                             return self::ACCESS_GRANTED;
  65.                         } elseif ($attribute === self::EXPORT && $line->getExporter() === true) {
  66.                             return self::ACCESS_GRANTED;
  67.                         }
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.         if ( ! $entityFounded) {
  73.             if($this->parameterBag->get('kernel.debug') === true) {
  74. //                throw new \Exception('This entity not found in rights : '.$objectClassName);
  75.             }
  76.             $this->logger->warning('This entity not found in rights : '.$objectClassName);
  77.         }
  78.         return self::ACCESS_ABSTAIN;
  79.     }
  80.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  81.     {
  82.         return true;
  83.     }
  84. }