src/Security/Voters/MeetingVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voters;
  3. use App\Entity\Meeting;
  4. use App\Entity\OperatoreUser;
  5. use App\Entity\User;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Security;
  9. class MeetingVoter extends Voter
  10. {
  11.   const EDIT 'edit';
  12.   const VIEW 'view';
  13.   const DELETE 'delete';
  14.   private $security;
  15.   public function __construct(Security $security)
  16.   {
  17.     $this->security $security;
  18.   }
  19.   protected function supports($attribute$subject)
  20.   {
  21.     // if the attribute isn't one we support, return false
  22.     if (!in_array($attribute, [self::EDITself::VIEWself::DELETE])) {
  23.       return false;
  24.     }
  25.     // only vote on `Meeting` objects
  26.     if ($subject && !$subject instanceof Meeting) {
  27.       return false;
  28.     }
  29.     return true;
  30.   }
  31.   protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  32.   {
  33.     $user $token->getUser();
  34.     if (!$user instanceof User) {
  35.       // the user must be logged in; if not, deny access
  36.       return false;
  37.     }
  38.     // you know $subject is a Meeting object, thanks to `supports()`
  39.     /** @var Meeting $meeting */
  40.     $meeting $subject;
  41.     switch ($attribute) {
  42.       case self::EDIT:
  43.         return $this->canEdit($meeting$user);
  44.       case self::VIEW:
  45.         return $this->canView($meeting$user);
  46.       case self::DELETE:
  47.         return $this->canDelete($meeting$user);
  48.     }
  49.     throw new \LogicException('This code should not be reached!');
  50.   }
  51.   private function canView(Meeting $meetingUser $user)
  52.   {
  53.     // if they can edit, they can view
  54.     if ($this->canEdit($meeting$user)) {
  55.       return true;
  56.     }
  57.     return $user->getId() === $meeting->getUserId();
  58.   }
  59.   private function canEdit(Meeting $meetingUser $user)
  60.   {
  61.     $calendar $meeting->getCalendar();
  62.     if ($this->security->isGranted('ROLE_ADMIN')) {
  63.       return true;
  64.     }
  65.     if ($this->security->isGranted('ROLE_OPERATORE')) {
  66.       /** @var OperatoreUser $user */
  67.       if ($user->getId() === $calendar->getOwnerId() || in_array($user->getId(), $calendar->getModeratorsId())) {
  68.         return true;
  69.       }
  70.     }
  71.     return false;
  72.   }
  73.   private function canDelete(Meeting $meetingUser $user)
  74.   {
  75.     // if they can edit, they can delete
  76.     if ($this->canEdit($meeting$user)) {
  77.       return true;
  78.     }
  79.     return false;
  80.   }
  81. }