src/Security/Voter/UtilisateurVoter.php line 13

  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Utilisateur;
  4. use App\Entity\Structure;
  5. use App\Entity\Professionnel;
  6. use App\Repository\LicenceRepository;
  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 UtilisateurVoter extends Voter
  11. {
  12.     private $licenceRepository;
  13.     public const DROIT_STRUCTURE 'DROIT_STRUCTURE';
  14.     public const DROIT_PROFESSIONNEL 'DROIT_PROFESSIONNEL';
  15.     public const DROIT_GESTION_PROFESSIONNEL 'DROIT_GESTION_PROFESSIONNEL';
  16.     public function __construct(LicenceRepository $licenceRepository)
  17.     {
  18.         $this->licenceRepository $licenceRepository;
  19.     }
  20.     protected function supports(string $attributemixed $subject): bool
  21.     {
  22.         return in_array($attribute, [self::DROIT_STRUCTURE,self::DROIT_PROFESSIONNEL,self::DROIT_GESTION_PROFESSIONNEL]);
  23.     }
  24.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  25.     {
  26.         $user $token->getUser();
  27.         // if the user is anonymous, do not grant access
  28.         if (!$user instanceof UserInterface) {
  29.             return false;
  30.         }
  31.         // ... (check conditions and return true to grant permission) ...
  32.         switch ($attribute) {
  33.             case self::DROIT_STRUCTURE:
  34.                 if (!$subject instanceof Structure) {
  35.                     throw new \Exception('Le sujet n\'est pas une instance \\App\\Entity\\Structure. Objet de la classe ' get_class($subject) . ' fourni');
  36.                 }
  37.                 if (in_array(Utilisateur::ROLE_SUPERADMIN$user->getRoles())) {
  38.                     return true;
  39.                 } else {
  40.                     return ($user->getStructure() == $subject);
  41.                 }
  42.                 break;
  43.             case self::DROIT_PROFESSIONNEL:
  44.                 if (!$subject instanceof \Symfony\Component\HttpFoundation\Request && !is_int($subject) ) {
  45.                     throw new \Exception('Le sujet n\'est pas une instance \\Symfony\\Component\\HttpFoundation\\Request ni un entier. Objet de la classe ' get_class($subject) . ' fourni');
  46.                 }
  47.     
  48.                 if (in_array(Utilisateur::ROLE_SUPERADMIN$user->getRoles())) {
  49.                     return true;
  50.                 } else {
  51.                     return ( ( ( is_int($subject) && $user->getStructure()->getId() == $subject ) )
  52.                                 || (( null != $subject->get('structure') ) && ( $user->getStructure()->getId() == $subject->get('structure') ) ) );
  53.                 }
  54.                 break;
  55.             case self::DROIT_GESTION_PROFESSIONNEL:
  56.                 if (!$subject instanceof Professionnel) {
  57.                     throw new \Exception('Le sujet n\'est pas une instance \\App\\Entity\\Professionnel. Objet de la classe ' get_class($subject) . ' fourni');
  58.                 }
  59.     
  60.                 if (in_array(Utilisateur::ROLE_SUPERADMIN$user->getRoles())) {
  61.                     return true;
  62.                 } else {
  63.                     return ( NULL != $this->licenceRepository->findOneBy(['professionnel' => $subject'structure' => $user->getStructure()]) );
  64.                 }
  65.                 break;                    
  66.         }
  67.         return false;
  68.     }
  69. }