src/Security/FeaturesVoter.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Configuracao;
  4. use App\Repository\ConfiguracaoRepository;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. class FeaturesVoter extends Voter
  8. {
  9.     public const PROJETO_PESQUISA 'FEATURE_PROJETO_PESQUISA';
  10.     public const SECRETARIA_PROJETO_PESQUISA 'FEATURE_SECRETARIA_PROJETO_PESQUISA';
  11.     public const ALUNO_PROJETO_PESQUISA 'FEATURE_ALUNO_PROJETO_PESQUISA';
  12.     public const PROFESSOR_PROJETO_PESQUISA 'FEATURE_PROFESSOR_PROJETO_PESQUISA';
  13.     public const POSDOC_PROJETO_PESQUISA 'FEATURE_POSDOC_PROJETO_PESQUISA';
  14.     public const POS_DOC 'FEATURE_POS_DOC';
  15.     public const LINHAS_POS_DOC 'LINHAS_POS_DOC';
  16.     public const SECRETARIA_POS_DOC 'FEATURE_SECRETARIA_POS_DOC';
  17.     public const PROFESSOR_POS_DOC 'FEATURE_PROFESSOR_POS_DOC';
  18.     public const POSDOC_POS_DOC 'FEATURE_POSDOC_POS_DOC';
  19.     public const ACC_PAP 'FEATURE_ACC_PAP';
  20.     public const SECRETARIA_ACC_PAP 'FEATURE_SECRETARIA_ACC_PAP';
  21.     public const ALUNO_ACC_PAP 'FEATURE_ALUNO_ACC_PAP';
  22.     public const USER_ACC_PAP 'FEATURE_USER_ACC_PAP';
  23.     public const PROFICIENCIA 'FEATURE_PROFICIENCIA';
  24.     public const SECRETARIA_PROFICIENCIA 'FEATURE_SECRETARIA_PROFICIENCIA';
  25.     public const ALUNO_PROFICIENCIA 'FEATURE_ALUNO_PROFICIENCIA';
  26.     public const USER_PROFICIENCIA 'FEATURE_USER_PROFICIENCIA';
  27.     public const DEFESAS 'FEATURE_DEFESAS';
  28.     public const SECRETARIA_DEFESAS 'FEATURE_SECRETARIA_DEFESAS';
  29.     public const DOUTORADO 'FEATURE_DOUTORADO';
  30.     public const RESERVAS 'FEATURE_RESERVAS';
  31.     public const SECRETARIA_RESERVAS 'FEATURE_SECRETARIA_RESERVAS';
  32.     public const BOLSAS 'FEATURE_BOLSAS';
  33.     public const SECRETARIA_BOLSAS 'FEATURE_SECRETARIA_BOLSAS';
  34.     public const FINANCEIRO 'FEATURE_FINANCEIRO';
  35.     public const SECRETARIA_FINANCEIRO 'FEATURE_SECRETARIA_FINANCEIRO';
  36.     public const PROFESSOR_PNPD 'FEATURE_PROF_PNPD';
  37.     public const PROFESSOR_SEM_VAGA 'FEATURE_PROF_SEM_VAGA';
  38.     public const PROFESSOR_VISITANTE 'FEATURE_PROF_VISITANTE';
  39.     public const PROFESSOR_EDITOR 'FEATURE_PROF_EDITOR';
  40.     public const SECRETARIA_PROFESSOR_PNPD 'FEATURE_SECRETARIA_PROF_PNPD';
  41.     public const SECRETARIA_PROFESSOR_SEM_VAGA 'FEATURE_SECRETARIA_PROF_SEM_VAGA';
  42.     public const SECRETARIA_PROFESSOR_VISITANTE 'FEATURE_SECRETARIA_PROF_VISITANTE';
  43.     public const SECRETARIA_PROFESSOR_EDITOR 'FEATURE_SECRETARIA_PROF_EDITOR';
  44.     private ?Configuracao $funcionalidades;
  45.     public function __construct(ConfiguracaoRepository $configuracaoRepository)
  46.     {
  47.         $this->funcionalidades $configuracaoRepository->getConfiguracao('funcionalidades');
  48.     }
  49.     protected function supports(string $attribute$subject): bool
  50.     {
  51.         return strpos($attribute'FEATURE_') === || strpos($attribute'LINHAS_POS_DOC') === 0;
  52.     }
  53.     protected function featureAllowed(string $feature): bool
  54.     {
  55.         if (!$this->funcionalidades) {
  56.             return true;
  57.         }
  58.         if (!$this->funcionalidades->hasProperty($feature)) {
  59.             return true;
  60.         }
  61.         if ($this->funcionalidades->getProperty($feature)) {
  62.             return true;
  63.         }
  64.         return false;
  65.     }
  66.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  67.     {
  68.         $role null;
  69.         if ($attribute === self::LINHAS_POS_DOC) {
  70.             $user $token->getUser();
  71.             return $this->featureAllowed('pos_doc') && (
  72.                 in_array('ROLE_ADMIN'$user->getRoles())
  73.                 || in_array('ROLE_SECRETARIA'$user->getRoles())
  74.                 || in_array('ROLE_PROFESSOR'$user->getRoles())
  75.             );
  76.         }
  77.         elseif (preg_match('/^FEATURE_(ADMIN|SECRETARIA|PROFESSOR|POSDOC|ALUNO|USER)_([_A-Z]+)$/'$attribute$match)) {
  78.             $role 'ROLE_'.$match[1];
  79.             $feature strtolower($match[2]);
  80.         }
  81.         else {
  82.             $feature strtolower(str_replace('FEATURE_'''$attribute));
  83.         }
  84.         if (!$this->featureAllowed($feature)) {
  85.             return false;
  86.         }
  87.         if (empty($role)) {
  88.             return true;
  89.         }
  90.         $user $token->getUser();
  91.         return in_array('ROLE_ADMIN'$user->getRoles()) || in_array($role$user->getRoles());
  92.     }
  93. }