src/Security/Voter/MasterVoter.php line 20

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\CdpEntityInterface;
  4. use App\Exception\Security\CurrentAccountWasNotSetException;
  5. use App\Metadata\SchemaFactory;
  6. use App\Metadata\Schema\Schema;
  7. use App\Security\Voter\CdpVoterHelperTrait;
  8. use App\Service\CdpService;
  9. use Cdp\Transverse\Enumerations\Entity\Fond\AbstractEnumerations as FondAbstractEnumerations;
  10. use Cdp\Transverse\Enumerations\Security\Voter\FondEnumerationCRUDVoter;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  13. /**
  14.  * Le seul voter Symfony
  15.  * C'est lui qui va décider de router la decision sur le SchemaPermissionVoter ou sur un CdpEntityVoterInterface dédié
  16.  */
  17. class MasterVoter extends Voter
  18. {
  19.     use CdpVoterHelperTrait;
  20.     /**
  21.      * @var CdpService
  22.      */
  23.     protected $cdp;
  24.     /**
  25.      * @var CdpEntityVoter[]
  26.      */
  27.     protected $cdpEntityVoters = [];
  28.     /**
  29.      * @var FondEnumerationCRUDVoter
  30.      */
  31.     protected $fondEnumerationCRUDVoter;
  32.     /**
  33.      * @var SchemaPermissionVoter
  34.      */
  35.     protected $schemaPermissionVoter;
  36.     public function __construct(CdpService $cdpSchemaFactory $schemaFactoryiterable $cdpEntityVotersFondEnumerationCRUDVoter $fondEnumerationCRUDVoterSchemaPermissionVoter $schemaPermissionVoter)
  37.     {
  38.         $this->cdp $cdp;
  39.         $this->schemaFactory $schemaFactory;
  40.         foreach ($cdpEntityVoters as $cdpEntityVoter) {
  41.             $this->cdpEntityVoters[$cdpEntityVoter->getEntityClass()] = $cdpEntityVoter;
  42.         }
  43.         $this->fondEnumerationCRUDVoter $fondEnumerationCRUDVoter;
  44.         $this->schemaPermissionVoter $schemaPermissionVoter;
  45.     }
  46.     protected function getCurrentAccount()
  47.     {
  48.         return $this->cdp->getCurrentAccount();
  49.     }
  50.     protected function supports($attribute$subject)
  51.     {
  52.         // Extract classname
  53.         try {
  54.             $class $this->extractSubjectClass($subject);
  55.         } catch (\InvalidArgumentException $e) {
  56.             return false;
  57.         }
  58.         // Only CdpEntities
  59.         if (!is_subclass_of($classCdpEntityInterface::class)) {
  60.             return false;
  61.         }
  62.         // Extract action and context
  63.         try {
  64.             list($action$context) = $this->extractRoleAndContext($attribute);
  65.         } catch (\InvalidArgumentException $e) {
  66.             return false;
  67.         }
  68.         try {
  69.             $currentAccount $this->getCurrentAccount();
  70.         } catch (CurrentAccountWasNotSetException $e) {
  71.             $currentAccount null;
  72.         }
  73.         // Check si il n'existe pas un cdpvoter dédié
  74.         if (array_key_exists($class$this->cdpEntityVoters)) {
  75.             return $this->cdpEntityVoters[$class]->supportsAction($action$context$subject$currentAccount);
  76.         }
  77.         // Ne peut pas être un cdpEntityVoters car il gère une abstract
  78.         if (is_subclass_of($classFondAbstractEnumerations::class)) {
  79.             return $this->fondEnumerationCRUDVoter->supportsAction($action$context$subject$currentAccount);
  80.         }
  81.         // Sinon on retourne les permissions de schema + account rights
  82.         return $this->schemaPermissionVoter->supportsAction($action$context$subject$currentAccount);
  83.     }
  84.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  85.     {
  86.         $class $this->extractSubjectClass($subject);
  87.         list($action$context) = $this->extractRoleAndContext($attribute);
  88.         try {
  89.             $currentAccount $this->getCurrentAccount();
  90.         } catch (CurrentAccountWasNotSetException $e) {
  91.             $currentAccount null;
  92.         }
  93.         // Check si il n'existe pas un cdpvoter dédié
  94.         if (array_key_exists($class$this->cdpEntityVoters)) {
  95.             return $this->cdpEntityVoters[$class]->voteAction($action$context$subject$currentAccount);
  96.         }
  97.         if (is_subclass_of($classFondAbstractEnumerations::class)) {
  98.             return $this->fondEnumerationCRUDVoter->voteAction($action$context$subject$currentAccount);
  99.         }
  100.         // Sinon on retourne les permissions de schema + account rights
  101.         return $this->schemaPermissionVoter->voteAction($action$context$subject$currentAccount);
  102.     }
  103. }