src/Security/Voter/ForoVoter.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\CategoriaForo;
  4. use App\Entity\MensajeForo;
  5. use App\Entity\Tema;
  6. use App\Entity\UsuarioHermes;
  7. use App\Enum\RolEnum;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. class ForoVoter extends Voter
  12. {
  13. public const EDIT = 'EDIT';
  14. public const DELETE = 'DELETE';
  15. public const MANAGE_CATEGORIES = 'MANAGE_CATEGORIES';
  16. // Inyectamos RequestStack para leer la sesión
  17. public function __construct(private RequestStack $requestStack) {}
  18. protected function supports(string $attribute, $subject): bool
  19. {
  20. // Soporte para EDIT y DELETE de entidades existentes
  21. if (in_array($attribute, [self::EDIT, self::DELETE])) {
  22. return $subject instanceof MensajeForo || $subject instanceof Tema || $subject instanceof CategoriaForo;
  23. }
  24. // Soporte para MANAGE_CATEGORIES (no requiere subject específico)
  25. if ($attribute === self::MANAGE_CATEGORIES) {
  26. return true;
  27. }
  28. return false;
  29. }
  30. protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
  31. {
  32. $user = $token->getUser();
  33. if (!$user instanceof UsuarioHermes) {
  34. return false;
  35. }
  36. // --- INICIO DE LA LÓGICA REVISADA ---
  37. // Obtener el rol activo desde la sesión
  38. $session = $this->requestStack->getSession();
  39. $activeRole = $session->get('rol'); // Asumiendo que la clave de sesión es 'rol'
  40. // CONDICIÓN 1: ¿El rol activo en la sesión es CONSORCI?
  41. if ($activeRole === RolEnum::CONSORCI) {
  42. return true; // Si es CONSORCI, tiene permiso para todo.
  43. }
  44. // CONDICIÓN ESPECIAL: Gestión de categorías - solo CONSORCI
  45. if ($attribute === self::MANAGE_CATEGORIES) {
  46. return false; // Solo CONSORCI puede gestionar categorías
  47. }
  48. // CONDICIÓN 2: ¿Es el autor del contenido?
  49. // Obtenemos el PropietarioContenido del usuario
  50. $propietarioContenidos = $user->getPropietarioContenidos();
  51. if ($propietarioContenidos && !$propietarioContenidos->isEmpty()) {
  52. $propietarioActivo = $propietarioContenidos->first();
  53. // Verificar permisos según el tipo de subject
  54. if ($subject instanceof MensajeForo) {
  55. /** @var MensajeForo $mensaje */
  56. $mensaje = $subject;
  57. if ($mensaje->getPropietarioContenido() === $propietarioActivo) {
  58. return true;
  59. }
  60. } elseif ($subject instanceof Tema) {
  61. /** @var Tema $tema */
  62. $tema = $subject;
  63. if ($tema->getPropietarioContenido() === $propietarioActivo) {
  64. return true;
  65. }
  66. } elseif ($subject instanceof CategoriaForo) {
  67. /** @var CategoriaForo $categoria */
  68. // Las categorías solo pueden ser gestionadas por CONSORCI
  69. // Este caso no debería llegar aquí ya que se maneja arriba
  70. return false;
  71. }
  72. }
  73. // --- FIN DE LA LÓGICA REVISADA ---
  74. return false;
  75. }
  76. }