src/Security/PostVoter.php line 27

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace App\Security;
  11. use App\Entity\Post;
  12. use App\Entity\User;
  13. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  14. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  15. /**
  16.  * It grants or denies permissions for actions related to blog posts (such as
  17.  * showing, editing and deleting posts).
  18.  *
  19.  * See https://symfony.com/doc/current/security/voters.html
  20.  *
  21.  * @author Yonel Ceruto <yonelceruto@gmail.com>
  22.  */
  23. class PostVoter extends Voter
  24. {
  25.     // Defining these constants is overkill for this simple application, but for real
  26.     // applications, it's a recommended practice to avoid relying on "magic strings"
  27.     public const DELETE 'delete';
  28.     public const EDIT 'edit';
  29.     public const SHOW 'show';
  30.     /**
  31.      * {@inheritdoc}
  32.      */
  33.     protected function supports(string $attribute$subject): bool
  34.     {
  35.         // this voter is only executed on Post objects and for three specific permissions
  36.         return $subject instanceof Post && \in_array($attribute, [self::SHOWself::EDITself::DELETE], true);
  37.     }
  38.     /**
  39.      * {@inheritdoc}
  40.      *
  41.      * @param Post $post
  42.      */
  43.     protected function voteOnAttribute(string $attribute$postTokenInterface $token): bool
  44.     {
  45.         $user $token->getUser();
  46.         // the user must be logged in; if not, deny permission
  47.         if (!$user instanceof User) {
  48.             return false;
  49.         }
  50.         // the logic of this voter is pretty simple: if the logged user is the
  51.         // author of the given blog post, grant permission; otherwise, deny it.
  52.         // (the supports() method guarantees that $post is a Post object)
  53.         return $user === $post->getAuthor();
  54.     }
  55. }