src/Security/Voters/ChatMessageVoter.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voters;
  3. use App\Entity\ChatMessage;
  4. use App\Entity\User;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. class ChatMessageVoter extends Voter
  8. {   
  9.     protected function supports($attribute$subject)
  10.     {  
  11.         return in_array($attribute, ['EDIT''DELETE']) && $subject instanceof ChatMessage
  12.     }
  13.     /**
  14.      * @param string $attribute ('EDIT' or 'DELETE')
  15.      * @param ChatMessage $subject
  16.      * @param TokenInterface $token JWT token
  17.      * @return bool
  18.      */
  19.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  20.     {   
  21.         $user $this->getUserFromToken($token);
  22.         if (!$user instanceof User) {
  23.             return false;
  24.         }
  25.         if ($attribute === 'EDIT' || $attribute === 'DELETE') {  
  26.             // On request, if $user->getId() === $subject->getAuthor() return true else return false
  27.             if($user->getId() === $subject->getAuthor()->getId()) {
  28.                 return true;
  29.             }
  30.             if($user->getRoles()[0] === 'ROLE_ADMIN') {
  31.                 // allow admins to edit or delete any chat message
  32.                 return true;
  33.             }
  34.         }
  35.         return false;
  36.     }
  37.     /**
  38.      * Get user from token (JWT)
  39.      * 
  40.      * @param TokenInterface $token
  41.      * @return User|null
  42.      */
  43.     private function getUserFromToken(TokenInterface $token)
  44.     {   
  45.         $user $token->getUser();
  46.         return $user;
  47.     }
  48. }