src/Voter/GuestbookVoter.php line 16

Open in your IDE?
  1. <?php
  2. /*
  3.  * Author: Dominik Piekarski <code@dompie.de>
  4.  * Created at: 2021/08/26 15:50
  5.  */
  6. declare(strict_types=1);
  7. namespace App\Voter;
  8. use App\Security\ApiUser;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  12. use Symfony\Component\Security\Core\Security;
  13. class GuestbookVoter extends Voter
  14. {
  15.     public const PERMISSION_MANAGE_ENTRY 'guestbookManageEntry';
  16.     public const PERMISSION_VIEW_PUBLIC 'guestbookViewEntry';
  17.     public const PERMISSION_COMMENT 'guestbookCommentEntry';
  18.     protected Security $security;
  19.     /**
  20.      * @var RequestStack
  21.      */
  22.     protected RequestStack $requestStack;
  23.     /**
  24.      * @param Security $security
  25.      * @param RequestStack $requestStack
  26.      */
  27.     public function __construct(Security $securityRequestStack $requestStack)
  28.     {
  29.         $this->security $security;
  30.         $this->requestStack $requestStack;
  31.     }
  32.     protected function supports(string $attribute$subject)
  33.     {
  34.         $supportedAction in_array($attribute, [
  35.             self::PERMISSION_MANAGE_ENTRY,
  36.             self::PERMISSION_VIEW_PUBLIC,
  37.             self::PERMISSION_COMMENT
  38.         ], true);
  39.         $supportedSubject is_array($subject) && isset($subject['id']) && isset($subject['recipient'])
  40.             && isset($subject['is_spam']) && isset($subject['is_hidden']);
  41.         return $supportedSubject && $supportedAction;
  42.     }
  43.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token)
  44.     {
  45.         /** @var ApiUser $user */
  46.         $user $this->security->getUser();
  47.         // admins may do anything, but may NOT comment
  48.         if ($attribute !== self::PERMISSION_COMMENT && $this->security->isGranted('ROLE_ADMIN'$user)) {
  49.             return true;
  50.         }
  51.         $isKnownUser $user instanceof ApiUser && $user->getMemberId() > 0;
  52.         if ($isKnownUser && $subject['recipient']['username'] === $user->getUsername()) {
  53.             // owner may do anything
  54.             return true;
  55.         }
  56.         switch ($attribute) {
  57.             case self::PERMISSION_COMMENT:
  58.             case self::PERMISSION_MANAGE_ENTRY:
  59.                 // operators may comment and delete, but only via the operator app / section
  60.                 return $this->security->isGranted('ROLE_OPERATOR'$user) &&
  61.                     $this->requestStack->getMainRequest()->get('_route') === 'app_messenger_operator_guestbook';
  62.             case self::PERMISSION_VIEW_PUBLIC:
  63.                 return $subject['is_hidden'] === false && $subject['is_spam'] === false;
  64.         }
  65.         return false;
  66.     }
  67. }