src/Security/CursoVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Curso;
  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 CursoVoter extends Voter
  10. {
  11. public const PUEDE_VER = 'VER_CURSO';
  12. public const PUEDE_INSCRIBIRSE = 'INSCRIBIRSE_CURSO';
  13. public const ESTA_BORRADO = 'ESTA_BORRADO';
  14. public function __construct(private readonly Security $security)
  15. {
  16. }
  17. protected function supports(string $attribute, $subject): bool
  18. {
  19. if (!in_array($attribute, [self::PUEDE_VER, self::ESTA_BORRADO, self::PUEDE_INSCRIBIRSE])) {
  20. return false;
  21. }
  22. if (!$subject instanceof Curso) {
  23. return false;
  24. }
  25. return true;
  26. }
  27. protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
  28. {
  29. /** @var Usuario $user */
  30. $user = $token->getUser();
  31. if (!$user) {
  32. return false;
  33. }
  34. /** @var Curso $curso */
  35. $curso = $subject;
  36. switch ($attribute) {
  37. case self::PUEDE_VER:
  38. return $this->puedeVer($curso, $user);
  39. case self::PUEDE_INSCRIBIRSE:
  40. return $this->puedeInscribirse($curso, $user);
  41. case self::ESTA_BORRADO:
  42. return !$this->estaBorrado($curso);
  43. }
  44. throw new LogicException('This code should not be reached!');
  45. }
  46. // Comprobamos si esta marcado como "borrado".
  47. private function estaBorrado(Curso $curso): bool
  48. {
  49. return $curso->isBorrado();
  50. }
  51. // Comprobamos si está marcado como "borrado", y si es formador que el curso perteneza a su empresa.
  52. private function puedeVer(Curso $curso, Usuario $user): bool
  53. {
  54. if ($this->estaBorrado($curso)) {
  55. return false;
  56. }
  57. // Los formadores solo si pertenece a su empresa.
  58. if (!$this->security->isGranted('ROLE_ADMIN') &&
  59. $this->security->isGranted('ROLE_FORMADOR') &&
  60. $curso->getEmpresaFormacion() !== $user->getEmpresaFormacion()) {
  61. return false;
  62. }
  63. return true;
  64. }
  65. // Comprobamos si está marcado como "borrado", y si el usuario logueado puede inscribirse.
  66. private function puedeInscribirse(Curso $curso, Usuario $user): bool
  67. {
  68. if ($this->estaBorrado($curso)) {
  69. return false;
  70. }
  71. // Solamente los usuarios normales.
  72. return $this->security->isGranted('IS_AUTHENTICATED') && $user->getRoles()[0] === 'ROLE_USER';
  73. }
  74. }