src/Security/Voter/MaintenanceTaskVoter.php line 13

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Admin;
  4. use App\Entity\MaintenanceTask;
  5. use App\Entity\ProviderUser;
  6. use App\Entity\User;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. use Symfony\Component\Security\Core\User\UserInterface;
  10. class MaintenanceTaskVoter extends Voter
  11. {
  12.     public const VIEW 'view';
  13.     protected function supports(string $attribute$subject): bool
  14.     {
  15.         // replace with your own logic
  16.         // https://symfony.com/doc/current/security/voters.html
  17.         return in_array($attribute, [self::VIEW])
  18.             && $subject instanceof MaintenanceTask;
  19.     }
  20.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  21.     {
  22.         $user $token->getUser();
  23.         // if the user is anonymous, do not grant access
  24.         if (!$user instanceof UserInterface) {
  25.             return false;
  26.         }
  27.         switch ($attribute) {
  28.             case self::VIEW:
  29.                 return $this->canView($subject$user);
  30.         }
  31.         return false;
  32.     }
  33.     private function canView(MaintenanceTask $maintenanceTaskUserInterface $user): bool
  34.     {
  35.         // De momento, si es Administrador puede ver todas las actuaciones
  36.         if ($user instanceof Admin) {
  37.             return true;
  38.         }
  39.         // Los usuarios de los clientes no pueden acceder a las actuaciones
  40.         if ($user instanceof User) {
  41.             return false;
  42.         }
  43.         if ($user instanceof ProviderUser) {
  44.             return $user->getProvider()->getId() === $maintenanceTask->getMaintenance()->getProvider()?->getId();
  45.         }
  46.         return false;
  47.     }
  48. }