src/Security/BFChallengeVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\BFChallenge;
  4. use App\Entity\BFUser;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\Security;
  8. class BFChallengeVoter extends Voter
  9. {
  10.     private $security;
  11.     // these strings are just invented: you can use anything
  12.     const EDIT 'edit';
  13.     const EDITNOTSUPER 'editnotsuper';
  14.     const DELETE 'delete';
  15.     
  16.     public function __construct(Security $security)
  17.     {
  18.         $this->security $security;
  19.     }
  20.     protected function supports($attribute$subject)
  21.     {
  22.         // if the attribute isn't one we support, return false
  23.         if (!in_array($attribute, [self::EDITself::DELETEself::EDITNOTSUPER])) {
  24.             return false;
  25.         }
  26.         // only vote on `BFChallenge` objects
  27.         if (!$subject instanceof BFChallenge) {
  28.             return false;
  29.         }
  30.         return true;
  31.     }
  32.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  33.     {
  34.         if($attribute!=self::EDITNOTSUPER && $this->security->isGranted('ROLE_SUPER_ADMIN'))
  35.         {
  36.             return true;
  37.         }
  38.         
  39.         $user $token->getUser();
  40.         
  41.         if (!$user instanceof BFUser) {
  42.             // the user must be logged in; if not, deny access
  43.             return false;
  44.         }
  45.     
  46.         // you know $subject is a BFChallenge object, thanks to `supports()`
  47.         /** @var Post $post */
  48.         $bfchallenge $subject;
  49.         switch ($attribute) {
  50.             case self::EDIT:
  51.                 return $this->canEdit($bfchallenge$user);
  52.             case self::EDITNOTSUPER:
  53.                 return $this->canEdit($bfchallenge$user);
  54.             case self::DELETE:
  55.                 return $this->canDelete($bfchallenge$user);
  56.         }
  57.         throw new \LogicException('This code should not be reached!');
  58.     }
  59.     private function canEdit(BFChallenge $bfchallengeBFUser $user)
  60.     {
  61.         // if they can edit, they can view
  62.         if ($this->canDelete($bfchallenge$user)) {
  63.             return true;
  64.         }
  65.         
  66.         return $bfchallenge->getAdministrators()->contains($user);
  67.     }
  68.     private function canDelete(BFChallenge $bfchallengeBFUser $user)
  69.     {
  70.         return $user==$bfchallenge->getOwner();
  71.     }
  72. }
  73. ?>