src/Security/SolicitudBecaAlumnoVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\SolicitudBecaAlumno;
  4. use App\Entity\Usuario;
  5. use LogicException;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Security;
  9. class SolicitudBecaAlumnoVoter extends Voter
  10. {
  11. public const PUEDE_DESCARGAR = 'DESCARGAR_SOLICITUD_BECA_ALUMNO';
  12. public function __construct(private readonly Security $security)
  13. {
  14. }
  15. protected function supports(string $attribute, $subject): bool
  16. {
  17. if (!in_array($attribute, [self::PUEDE_DESCARGAR])) {
  18. return false;
  19. }
  20. if (!$subject instanceof SolicitudBecaAlumno) {
  21. return false;
  22. }
  23. return true;
  24. }
  25. protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
  26. {
  27. /** @var Usuario $user */
  28. $user = $token->getUser();
  29. if (!$user) {
  30. return false;
  31. }
  32. /** @var SolicitudBecaAlumno $solicitudBecaAlumno */
  33. $solicitudBecaAlumno = $subject;
  34. switch ($attribute) {
  35. case self::PUEDE_DESCARGAR:
  36. return $this->puedeDescargar($solicitudBecaAlumno, $user);
  37. }
  38. throw new LogicException('This code should not be reached!');
  39. }
  40. // Comprobamos si es formador que el alumno pertenezca a un curso de su empresa.
  41. private function puedeDescargar(SolicitudBecaAlumno $solicitudBecaAlumno, Usuario $user): bool
  42. {
  43. // Si es formador e intenta ver un alumno que no es de un curso de su empresa.
  44. if (!$this->security->isGranted('ROLE_ADMIN') &&
  45. $this->security->isGranted('ROLE_FORMADOR') &&
  46. $solicitudBecaAlumno->getAlumno()->getSolicitud()->getUsuario()->getEmpresaFormacion() !== $user->getEmpresaFormacion()) {
  47. return false;
  48. }
  49. return true;
  50. }
  51. }