src/Security/Voter/DroitsVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\User;
  4. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  5. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  6. use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
  7. use Symfony\Component\Yaml\Yaml;
  8. use Doctrine\ORM\EntityManager
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. use App\Entity\Permission;
  11. use App\Repository\RoleRepository;
  12. class DroitsVoter Implements VoterInterface {
  13.     
  14.     protected $actions = array();
  15.     
  16.     public function __construct(\Doctrine\ORM\EntityManagerInterface $entityManager, \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface $tokenStorage){
  17.         $this->entityManager $entityManager;
  18.         $this->tokenStorage $tokenStorage;
  19.     }
  20.     
  21.     // Symfony demandera à cette classe si elle prend en charge ce type d'action sur cet objet
  22.     protected function supports($attributes$subject) {
  23.         // Si c'est attribut ne supportant pas un des sujets on dégage
  24.         if (!in_array($attributes[0], $this->actions) && !strstr($attributes[0], "droits_")) {
  25.             return false;
  26.         }
  27.         return true;
  28.     }
  29.     /**
  30.      *
  31.      * @param type $attribute représente l'action qu'on tente de faire
  32.      * @param type $subject
  33.      * @param TokenInterface $token
  34.      * @return boolean
  35.      * @throws \LogicException
  36.      */
  37.     public function vote(TokenInterface $token$subject,array $attributes): int {
  38.         if(!$this->supports($attributes$subject)){
  39.             return false;
  40.         }
  41.         $user $this->tokenStorage->getToken()->getUser();
  42.         // L'utilisateur doit être connecté
  43.         if (!$user instanceof User) {
  44.             return false;
  45.         }
  46.         // à ce stade le sujet est forcément un objet DemandeRecrutement ( grace à la méthode supports )
  47.         /** @var DemandeRecrutement $dr */
  48.         $dr $subject;
  49.         switch ($attributes[0]) {
  50.             default:
  51.                 return $this->canDo($attributes[0],$user);
  52.                 break;
  53.         }
  54.         
  55.         throw new \LogicException('Action Interdite!');
  56.     }
  57.     public function isAllowed($droit$user) {
  58.         $userRole $user->getRole();
  59.         // Si user superadmin
  60.         if ($userRole->getId() == \App\Enum\RoleCollection::SUPERADMIN_ID) {
  61.             return true;
  62.         }
  63.         
  64.         $objDroit $this->entityManager->getRepository(\App\Entity\Permission::class)->findOneByCode($droit);
  65.        
  66.         if(is_null($objDroit)){
  67.             return false;
  68.         }
  69.         
  70.         $arrRoles $objDroit->getRole($userRole)->toArray();
  71.         if(empty($arrRoles)){
  72.             return false;
  73.         }
  74.         foreach($arrRoles as $role){
  75.             if($role->getId() == $userRole->getId()){
  76.                 return true;
  77.             }
  78.         }
  79.         
  80.         return false;
  81.     }
  82.     
  83.     private function canDo($action,User $user){
  84.         return $this->isAllowed($action$user);
  85.     }
  86. }