src/Security/Voter/ProductsVoter.php line 11

  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Products;
  4. use Symfony\Bundle\SecurityBundle\Security;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\User\UserInterface;
  8. class ProductsVoter extends Voter
  9. {
  10.   const EDIT = 'PRODUCT_EDIT';
  11.   const DELETE = 'PRODUCT_DELETE';
  12.   
  13.   private $security;
  14.   public function __construct(Security $security)
  15.   {
  16.     $this->security = $security;    
  17.   }
  18.   protected function supports(string $attribute, $product): bool
  19.   {
  20.     if(!in_array($attribute, [self::EDIT, self::DELETE])){
  21.       return false;
  22.     }
  23.     if(! $product instanceof Products){
  24.       return false;
  25.     }
  26.     return true;
  27.     // Syntaxe alternative :
  28.     // return in_array($attribute, [self::EDIT, self::DELETE]) && $product instanceof Products;
  29.   }
  30.   protected function voteOnAttribute($attribute, $product, TokenInterface $token): bool
  31.   {
  32.     // On récupère l'utilisateur à partir du token
  33.     $user = $token->getUser();
  34.     if(!$user instanceof UserInterface) return false;
  35.     
  36.     // On vérifie si l'utilisateur est admin
  37.     if($this->security->isGranted('ROLE_ADMIN')) return true;
  38.     // On vérifie les permissions
  39.     switch($attribute){
  40.       case self::EDIT:
  41.         // On vérifie si l'utilisateur peut éditer
  42.         return $this->canEdit();
  43.         break;
  44.       case self::DELETE:
  45.         // On vérifie si l'utilisateur peut supprimer
  46.         return $this->canDelete();
  47.         break; 
  48.     }
  49.   }
  50.   private function canEdit(){
  51.     return $this->security->isGranted('ROLE_PRODUCT_ADMIN');
  52.   }
  53.   
  54.   private function canDelete(){
  55.     return $this->security->isGranted('ROLE_PRODUCT_ADMIN');
  56.   }
  57. }