<?php
namespace App\Security;
use App\Entity\Usuario;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class MixedRolesVoter extends Voter
{
public const REQUERIMENTOS = 'ACESSO_REQUERIMENTOS';
public const ACERTOS = 'ACESSO_ACERTOS';
public const BOLSAS = 'ACESSO_BOLSAS';
public const ISOLADAS = 'ACESSO_ISOLADAS';
public const DISCIPLINAS = 'ACESSO_DISCIPLINAS';
public const AUXILIOS = 'ACESSO_AUXILIOS';
public const LINHAS = 'ACESSO_LINHAS';
public const APENAS_ALUNO = 'APENAS_ALUNO';
public const APENAS_POSDOC = 'APENAS_POSDOC';
public const APENAS_PROFESSOR = 'APENAS_PROFESSOR';
public const APENAS_SECRETARIA = 'APENAS_SECRETARIA';
protected function supports(string $attribute, $subject): bool
{
return strpos($attribute, 'ACESSO_') === 0 || strpos($attribute, 'APENAS_') === 0;
}
/**
* Verifica se o usuário possui pelo menos uma das credenciais solicitadas
* @param string|array $roles
* @param UserInterface $user
* @return bool
*/
private function isGranted($roles, UserInterface $user): bool
{
$userRoles = $user->getRoles();
if (in_array('ROLE_ADMIN', $userRoles)) {
return true;
}
if (is_string($roles)) {
$roles = [$roles];
}
$granted = false;
foreach ($roles as $role) {
if (in_array($role, $userRoles)) {
$granted = true;
break;
}
}
return $granted;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
// if the user is anonymous, do not grant access
if (!$user instanceof UserInterface) {
return false;
}
// ... (check conditions and return true to grant permission) ...
switch ($attribute) {
case self::REQUERIMENTOS:
return $this->isGranted([Usuario::ROLE_ALUNO, Usuario::ROLE_POSDOC, Usuario::ROLE_PROFESSOR], $user);
break;
case self::ACERTOS:
case self::BOLSAS:
case self::ISOLADAS:
case self::AUXILIOS:
case self::LINHAS:
return $this->isGranted([Usuario::ROLE_SECRETARIA, Usuario::ROLE_PROFESSOR], $user);
break;
case self::DISCIPLINAS:
return $this->isGranted([Usuario::ROLE_SECRETARIA, Usuario::ROLE_PROFESSOR, Usuario::ROLE_ALUNO], $user);
break;
case self::APENAS_ALUNO:
return $this->isGranted([Usuario::ROLE_ALUNO], $user)
&& !$this->isGranted([Usuario::ROLE_POSDOC], $user)
&& !$this->isGranted([Usuario::ROLE_PROFESSOR], $user)
&& !$this->isGranted([Usuario::ROLE_SECRETARIA], $user);
break;
case self::APENAS_POSDOC:
return $this->isGranted([Usuario::ROLE_POSDOC], $user)
&& !$this->isGranted([Usuario::ROLE_ALUNO], $user)
&& !$this->isGranted([Usuario::ROLE_PROFESSOR], $user)
&& !$this->isGranted([Usuario::ROLE_SECRETARIA], $user);
break;
case self::APENAS_PROFESSOR:
return $this->isGranted([Usuario::ROLE_PROFESSOR], $user)
&& !$this->isGranted([Usuario::ROLE_POSDOC], $user)
&& !$this->isGranted([Usuario::ROLE_ALUNO], $user)
&& !$this->isGranted([Usuario::ROLE_SECRETARIA], $user);
break;
case self::APENAS_SECRETARIA:
return $this->isGranted([Usuario::ROLE_SECRETARIA], $user)
&& !$this->isGranted([Usuario::ROLE_POSDOC], $user)
&& !$this->isGranted([Usuario::ROLE_PROFESSOR], $user)
&& !$this->isGranted([Usuario::ROLE_ALUNO], $user);
break;
}
return false;
}
}