DRF. No mires solutions.md hasta entregar.
Ejercicio 1 — La matriz antes que el código
- 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.
- Marca las celdas con condición (no solo sí/no): p. ej. "editar evento: ORGANIZER de ese evento y state=DRAFT".
- 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
- 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). - Ciérralo con
get_queryset()filtrado por usuario (404 para ajenos) y verifica. ¿Qué gana 404 sobre 403 aquí? - Segunda capa:
has_object_permissionde propiedad. ¿En qué orden se evalúan y por qué ambas?
Ejercicio 3 — IsOrganizer y objeto
- Crea
IsOrganizer(endpoint: solo rol ORGANIZER crea eventos) yIsOrganizerOfEvent(objeto: el dueño del evento o staff edita). - Demuestra: B (organizador) intenta editar el evento de A → 403/404; B edita el suyo → 200.
- Bug a cazar: ¿tu serializer de Event acepta
organizerdesde el request? (escalada: asignarse eventos ajenos). Corrígelo (read_only o force del request.user).
Ejercicio 4 — La regla ABAC
- Implementa: "un evento solo se edita si
state=DRAFTo (state=PUBLISHEDy faltan >24h para starts_at)". ¿Dónde vive? (servicio, con la excepción de dominio apropiada). - Demuestra los 3 casos: draft editable, publicado a 48h editable, publicado a 2h → 422 con type
event-locked. - ¿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
- 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). - 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.