src/Security/Voter/UserRequest/UserOwnsRequestVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter\UserRequest;
  3. use App\Entity\User;
  4. use App\Manager\UserRightsManagerInterface;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use WebServiceCollectionBundle\Model\AtlasPce\UserRequestRequestModel;
  9. class UserOwnsRequestVoter extends Voter
  10. {
  11.     public const USER_OWNS_REQUEST 'OWNS_REQUEST';
  12.     /**
  13.      * @var LoggerInterface
  14.      */
  15.     protected $logger;
  16.     public function __construct(
  17.         LoggerInterface $logger
  18.     ) {
  19.         $this->logger            $logger;
  20.     }
  21.     /**
  22.      * {@inheritdoc}
  23.      */
  24.     public function supports($attribute$subject)
  25.     {
  26.         $isPostStatus    = static::USER_OWNS_REQUEST === $attribute;
  27.         $isSubjectUrModel = ($subject instanceof UserRequestRequestModel);
  28.         return $isPostStatus && $isSubjectUrModel;
  29.     }
  30.     /**
  31.      * {@inheritdoc}
  32.      */
  33.     public function voteOnAttribute($attribute$subjectTokenInterface $token)
  34.     {
  35.         $user $token->getUser();
  36.         switch ($attribute) {
  37.             case static::USER_OWNS_REQUEST:
  38.                 return $this->isOwner($subject$user);
  39.         }
  40.         throw new \LogicException('This code should not be reached!');
  41.     }
  42.     /**
  43.      * Test if a user is allowed to view a request.
  44.      *
  45.      * @param  string  $subject
  46.      * @param  User    $tokenAttributes
  47.      *
  48.      * @return bool
  49.      */
  50.     protected function isOwner(UserRequestRequestModel $requestUser $user): bool
  51.     {
  52.         $roles $user->getRoles();
  53.         // Admin and managers can see everything
  54.         if (
  55.             in_array(UserRightsManagerInterface::ROLE_ADMIN$roles)
  56.             || in_array(UserRightsManagerInterface::ROLE_MANAGER$roles)
  57.         ) {
  58.             $this->logger->info('[UserOwnsRequestVoter] User {email} is admin, request {id} can have its status modified.', [
  59.                 'email' => $user->getEmail(),
  60.                 'id'    => $request->getId(),
  61.             ]);
  62.             return true;
  63.         }
  64.         $data      $request->getData();
  65.         $creatorId = !empty($data['userId']) ? (string) $data['userId'] : '';
  66.         // User created request
  67.         if ($creatorId === $user->getId()) {
  68.             $this->logger->info('[UserOwnsRequestVoter] User {email} {creatorId} created request {requestId}, it can have its status modified.', [
  69.                 'email'     => $user->getEmail(),
  70.                 'requestId' => $request->getId(),
  71.                 'creatorId' => $creatorId,
  72.             ]);
  73.             return true;
  74.         }
  75.         $this->logger->info('[UserOwnsRequestVoter] User {email} is neither admin nor creator of request {id}, status cannot be modified.', [
  76.             'email'     => $user->getEmail(),
  77.             'id'        => $request->getId(),
  78.             'creatorId' => $creatorId,
  79.             'userId'    => $user->getId(),
  80.         ]);
  81.         return false;
  82.     }
  83. }