src/Security/MixedRolesVoter.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Usuario;
  4. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  5. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  6. use Symfony\Component\Security\Core\User\UserInterface;
  7. class MixedRolesVoter extends Voter
  8. {
  9.     public const REQUERIMENTOS 'ACESSO_REQUERIMENTOS';
  10.     public const ACERTOS 'ACESSO_ACERTOS';
  11.     public const BOLSAS 'ACESSO_BOLSAS';
  12.     public const ISOLADAS 'ACESSO_ISOLADAS';
  13.     public const DISCIPLINAS 'ACESSO_DISCIPLINAS';
  14.     public const AUXILIOS 'ACESSO_AUXILIOS';
  15.     public const LINHAS 'ACESSO_LINHAS';
  16.     public const APENAS_ALUNO 'APENAS_ALUNO';
  17.     public const APENAS_POSDOC 'APENAS_POSDOC';
  18.     public const APENAS_PROFESSOR 'APENAS_PROFESSOR';
  19.     public const APENAS_SECRETARIA 'APENAS_SECRETARIA';
  20.     protected function supports(string $attribute$subject): bool
  21.     {
  22.         return strpos($attribute'ACESSO_') === || strpos($attribute'APENAS_') === 0;
  23.     }
  24.     /**
  25.      * Verifica se o usuário possui pelo menos uma das credenciais solicitadas
  26.      * @param string|array $roles
  27.      * @param UserInterface $user
  28.      * @return bool
  29.      */
  30.     private function isGranted($rolesUserInterface $user): bool
  31.     {
  32.         $userRoles $user->getRoles();
  33.         if (in_array('ROLE_ADMIN'$userRoles)) {
  34.             return true;
  35.         }
  36.         if (is_string($roles)) {
  37.             $roles = [$roles];
  38.         }
  39.         $granted false;
  40.         foreach ($roles as $role) {
  41.             if (in_array($role$userRoles)) {
  42.                 $granted true;
  43.                 break;
  44.             }
  45.         }
  46.         return $granted;
  47.     }
  48.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  49.     {
  50.         $user $token->getUser();
  51.         // if the user is anonymous, do not grant access
  52.         if (!$user instanceof UserInterface) {
  53.             return false;
  54.         }
  55.         // ... (check conditions and return true to grant permission) ...
  56.         switch ($attribute) {
  57.             case self::REQUERIMENTOS:
  58.                 return $this->isGranted([Usuario::ROLE_ALUNOUsuario::ROLE_POSDOCUsuario::ROLE_PROFESSOR], $user);
  59.                 break;
  60.             case self::ACERTOS:
  61.             case self::BOLSAS:
  62.             case self::ISOLADAS:
  63.             case self::AUXILIOS:
  64.             case self::LINHAS:
  65.                 return $this->isGranted([Usuario::ROLE_SECRETARIAUsuario::ROLE_PROFESSOR], $user);
  66.                 break;
  67.             case self::DISCIPLINAS:
  68.                 return $this->isGranted([Usuario::ROLE_SECRETARIAUsuario::ROLE_PROFESSORUsuario::ROLE_ALUNO], $user);
  69.                 break;
  70.             case self::APENAS_ALUNO:
  71.                 return $this->isGranted([Usuario::ROLE_ALUNO], $user)
  72.                     && !$this->isGranted([Usuario::ROLE_POSDOC], $user)
  73.                     && !$this->isGranted([Usuario::ROLE_PROFESSOR], $user)
  74.                     && !$this->isGranted([Usuario::ROLE_SECRETARIA], $user);
  75.                 break;
  76.             case self::APENAS_POSDOC:
  77.                 return $this->isGranted([Usuario::ROLE_POSDOC], $user)
  78.                     && !$this->isGranted([Usuario::ROLE_ALUNO], $user)
  79.                     && !$this->isGranted([Usuario::ROLE_PROFESSOR], $user)
  80.                     && !$this->isGranted([Usuario::ROLE_SECRETARIA], $user);
  81.                 break;
  82.             case self::APENAS_PROFESSOR:
  83.                 return $this->isGranted([Usuario::ROLE_PROFESSOR], $user)
  84.                     && !$this->isGranted([Usuario::ROLE_POSDOC], $user)
  85.                     && !$this->isGranted([Usuario::ROLE_ALUNO], $user)
  86.                     && !$this->isGranted([Usuario::ROLE_SECRETARIA], $user);
  87.                 break;
  88.             case self::APENAS_SECRETARIA:
  89.                 return $this->isGranted([Usuario::ROLE_SECRETARIA], $user)
  90.                     && !$this->isGranted([Usuario::ROLE_POSDOC], $user)
  91.                     && !$this->isGranted([Usuario::ROLE_PROFESSOR], $user)
  92.                     && !$this->isGranted([Usuario::ROLE_ALUNO], $user);
  93.                 break;
  94.         }
  95.         return false;
  96.     }
  97. }