<?php
namespace App\Security\Voter;
use App\Repository\TbPermisoUsuarioHimedAdminRepository;
use App\Repository\TbUsuarioHimedAdminRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Centraliza toda la lógica de los permisos para las acciones en usuarios de HiMed Admin
* y luego reutilizarlos en muchos lugares.
*/
class TbUsuarioHimedAdminRepositoryVoter extends Voter
{
private $tbPermisoUsuarioHimedAdminRepository;
public function __construct(TbPermisoUsuarioHimedAdminRepository $tbPermisoUsuarioHimedAdminRepository)
{
$this->tbPermisoUsuarioHimedAdminRepository = $tbPermisoUsuarioHimedAdminRepository;
}
protected function supports($attribute, $subject): bool
{
// https://symfony.com/doc/current/security/voters.html
return in_array(
$attribute,
['CREAR_USUARIO_HIMED_ADMIN',
'CONSULTAR_USUARIO_HIMED_ADMIN',
'EDITAR_USUARIO_HIMED_ADMIN',
'EDITAR_PERMISOS_USUARIO_HIMED_ADMIN'
])
&& $subject instanceof TbUsuarioHimedAdminRepository;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var TbUsuarioHimedAdminRepository $subject */
$user = $token->getUser();
// si el usuario es anónimo, no concede el acceso
if (!$user instanceof UserInterface) {
return false;
}
// ... (comprueba las condiciones y devuelve true para conceder el permiso) ...
switch ($attribute) {
case 'CREAR_USUARIO_HIMED_ADMIN':
// logica que determina si el usuario puede acceder a la ruta o acción deseada
// devuelve true o false
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolCrearUsuarioHimedAdmin' => true])) {
return true;
}
return false;
case 'CONSULTAR_USUARIO_HIMED_ADMIN':
// logica que determina si el usuario puede acceder a la ruta o acción deseada
// devuelve true o false
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolConsultarUsuarioHimedAdmin' => true])) {
return true;
}
return false;
case 'EDITAR_USUARIO_HIMED_ADMIN':
// logica que determina si el usuario puede acceder a la ruta o acción deseada
// devuelve true o false
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolEditarUsuarioHimedAdmin' => true])) {
return true;
}
return false;
case 'EDITAR_PERMISOS_USUARIO_HIMED_ADMIN':
// logica que determina si el usuario puede acceder a la ruta o acción deseada
// devuelve true o false
if ($this->tbPermisoUsuarioHimedAdminRepository->findBy(['intIdUsuarioHimedAdmin' => $user, 'boolEditarPermisosUsuarioHimedAdmin' => true])) {
return true;
}
return false;
}
return false;
}
}