src/Security/Voter/PermissionVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\User;
  4. use App\Repository\PermissionRepository;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\Security;
  8. use Symfony\Component\Security\Core\User\UserInterface;
  9. class PermissionVoter extends Voter
  10. {
  11.     public const VIEW 'VIEW';
  12.     public const ADD 'ADD';
  13.     public const EDIT 'EDIT';
  14.     public const DELETE 'DELETE';
  15.     public const SUPER_ADMIN 'SUPER_ADMIN';
  16.     private $security;
  17.     private $permissionRepository;
  18.     public function __construct(Security $securityPermissionRepository $permissionRepository)
  19.     {
  20.         $this->security $security;
  21.         $this->permissionRepository $permissionRepository;
  22.     }
  23.     protected function supports(string $attribute$subject): bool
  24.     {
  25.         // if the attribute isn't one we support, return false
  26.         if (!in_array($attribute, [self::VIEWself::ADDself::EDITself::DELETEself::SUPER_ADMIN])) 
  27.         {
  28.             return false;
  29.         }
  30.         if (!is_string($subject)) 
  31.         {
  32.             return false;
  33.         }
  34.         return true;
  35.     }
  36.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  37.     {
  38.         /** @var User $user */
  39.         $user $token->getUser();
  40.         // if the user is anonymous, do not grant access
  41.         if (!$user instanceof UserInterface) {
  42.             return false;
  43.         }
  44.         $roles = [];
  45.         $permissions = [];
  46.         foreach ($user->getProfiles() as $role)
  47.         {
  48.             $roles[] = $role->getProfil();
  49.             foreach ($role->getPermissions() as $permission)
  50.             {
  51.                 $permissions[] = $permission;
  52.             }
  53.         }
  54.         // Pour les utilisateurs ajoutés par le fournisseur, les droits sont gerés autrement
  55.         if (count($permissions) < 1)
  56.         {
  57.             foreach ($user->getPermissionFournisseurs() as $permission)
  58.             {
  59.                 $permissions[] = $permission;
  60.             }
  61.             
  62.         }
  63.         // le super admin peut tout faire
  64.         if (in_array(User::ROLE_SUPER_ADMIN$roles)) 
  65.         {
  66.             return true;
  67.         }
  68.         // l'administrateur peut tout faire sauf les suppressions (qui seront au cas par cas)
  69.         if ($this->security->isGranted(User::ROLE_SUPER_ADMIN) && in_array($attribute, [self::VIEWself::ADDself::EDIT])) 
  70.         {
  71.             return true;
  72.         }
  73.         if (count($permissions) < 1)
  74.         {
  75.             return false;
  76.         }
  77.         /** @var App\Entity\Permission $permission  */
  78.         foreach ($permissions as $permission)
  79.         {
  80.             if ($permission->getModule() === $subject)
  81.             {
  82.                 if (in_array($attribute$permission->getAttributes()))
  83.                 {
  84.                     return true;
  85.                 }
  86.             }
  87.         }
  88.         return false;
  89.     }
  90. }