Módulo 4 · Autenticación y seguridad

Lección 21 — Autorización

Roles, permisos y control de acceso por recurso: quién puede tocar qué.

Publicada
En esta lección
  1. Ejercicio 1 — La matriz antes que el código
  2. Ejercicio 2 — IDOR: provócalo y ciérralo
  3. Ejercicio 3 — IsOrganizer y objeto
  4. Ejercicio 4 — La regla ABAC
  5. Ejercicio 5 — Escalada de rol
  6. Entrega

DRF. No mires solutions.md hasta entregar.

Ejercicio 1 — La matriz antes que el código

  1. Construye la matriz completa (acciones × roles): listar/detalle evento, crear/editar evento, ver disponibilidad, crear reserva, ver/cancelar reserva ajena, iniciar pago, ver ventas, reembolsar, cambiar rol de usuario.
  2. Marca las celdas con condición (no solo sí/no): p. ej. "editar evento: ORGANIZER de ese evento y state=DRAFT".
  3. Resalta 2 celdas que hoy tu implementación NO cumple. Esas son tus tareas de los ejercicios 3-4.

Ejercicio 2 — IDOR: provócalo y ciérralo

  1. Crea 2 usuarios con 1 reserva cada uno. Con el token de A, llama GET /api/reservations/{uuid_de_B}/. ¿Qué responde tu API hoy? (si es 200: tienes el agujero en vivo).
  2. Ciérralo con get_queryset() filtrado por usuario (404 para ajenos) y verifica. ¿Qué gana 404 sobre 403 aquí?
  3. Segunda capa: has_object_permission de propiedad. ¿En qué orden se evalúan y por qué ambas?

Ejercicio 3 — IsOrganizer y objeto

  1. Crea IsOrganizer (endpoint: solo rol ORGANIZER crea eventos) y IsOrganizerOfEvent (objeto: el dueño del evento o staff edita).
  2. Demuestra: B (organizador) intenta editar el evento de A → 403/404; B edita el suyo → 200.
  3. Bug a cazar: ¿tu serializer de Event acepta organizer desde el request? (escalada: asignarse eventos ajenos). Corrígelo (read_only o force del request.user).

Ejercicio 4 — La regla ABAC

  1. Implementa: "un evento solo se edita si state=DRAFT o (state=PUBLISHED y faltan >24h para starts_at)". ¿Dónde vive? (servicio, con la excepción de dominio apropiada).
  2. Demuestra los 3 casos: draft editable, publicado a 48h editable, publicado a 2h → 422 con type event-locked.
  3. ¿Quién puede cancelar un evento ya publicado y qué pasa con las reservas activas? (diseño: política + efecto en estados; no lo implementes todo: el ADR basta).

Ejercicio 5 — Escalada de rol

  1. Intenta (como BUYER) PATCH /api/users/me/ {"role": "STAFF"}. Si tu serializer lo acepta: celebras haberlo cazado. Ciérralo (role jamás del input; cambio de rol solo con endpoint de staff + audit log de quién cambió a quién).
  2. Escribe el test que lo garantiza para siempre (regression test de la escalada).

Entrega

Pega la matriz, los tests y los endpoints corregidos. Después: Lección 22 — OWASP Top 10.