Permisos por rol en Digital Signage (s121)
Descripción
A partir de la sesión 121 (2026-06-09), el módulo Digital Signage (cartelería digital) aplica control de acceso basado en roles como el resto de CreaRack-Pro. Hasta ahora cualquier usuario autenticado en la organización —incluidos usuarios de solo lectura— podían hacer de todo: subir y borrar contenido, crear/editar/borrar playlists y pantallas, generar enlaces públicos para clientes externos, aprobar cambios e incluso disparar despliegues a dispositivos.
Con esta feature, el permiso de edición es obligatorio para cualquier mutación (create/update/delete/deploy/approve); las lecturas sensibles (reportes, auditoría, sincronización) exigen al menos permiso de vista.
Impacto
Antes:
readonly user → sube media, borra playlists, aprueba cambios, inicia deploy
Después:
readonly user → ve datos; NO puede mutar
operator user → puede editar contenido, listas, cronogramas, despliegues
admin user → acceso total
Cambios técnicos
1. Scope signage registrado en core/utils/permissions.py
VALID_SCOPES = (
# ...
"signage", # NUEVO
)
ROLE_DEFAULTS = {
"admin": { "signage": "edit", ... },
"operator": { "signage": "edit", ... },
"readonly": { "signage": "view", ... },
}
2. Gates en endpoints internos (signage/api/*)
Todas las mutaciones de content, playlists, players, schedules, share_links, approvals, deployments, display_control:
require_perm(signage, edit)antes de create/update/delete/deploy/approve.
Todas las lecturas sensibles (reportes hondos, datos SNMP, datos de sincronización):
require_perm(signage, view)antes de ejecutar.
Ejemplos (de CHANGELOG.md):
upload_media:require_perm(signage, edit)al inicio.bulk_delete_media:require_perm(signage, edit).create_deployment:require_perm(signage, edit).deploy_content_to_device:require_perm(signage, edit).update_corporate_image:require_perm(signage, edit).- Listados de reportes:
require_perm(signage, view).
3. Validación de scope en aprobaciones (M4)
Cuando un usuario aprueba un cambio solicitado por un cliente externo vía el portal (ClientShareLink), la nueva lógica valida que el playlist_id/schedule_id sigue dentro del scope permitido del share link — no solo que pertenezca a la org. El scope pudo cambiar entre la solicitud y la aprobación.
4. IDOR potencial en create_deployment (M8)
Ahora rechaza con código 400 (Bad Request) si un playlist_id o schedule_id no pertenece a la organización del usuario.
Seguridad multi-tenant
Cierra un agujero de seguridad real descubierto en la Auditoría Suprema del dominio signage:
- Privacidad: un readonly no puede ver/modificar contenido más allá de su rol.
- Integridad: solo un operador autorizado puede cambiar lo que se muestra en las pantallas públicas.
- Cumplimiento: alineado con el modelo de permisos estándar de CreaRack (como en network/racks/monitoring).
Archivos tocados
core/utils/permissions.py— registro del scopesignage/api/content.py— gates en upload/delete/transcode/reprocesssignage/api/playlists.py— gates en CRUDsignage/api/players.py— gates en CRUDsignage/api/schedules.py— gates en CRUDsignage/api/share_links.py— gates en CRUDsignage/api/approvals.py— gates en aprobación + revalidación de scopesignage/api/deployments.py— gates + validación IDORsignage/api/display_control.py— gates en control remotomonitoring/api/signage/deploy.py— gates en deploy/restore/publishmonitoring/api/signage/dashboard.py— gates en dashboard/reportesmonitoring/api/signage/discovery.py,groups.py,summary.py— gates en consultas
Véase también
- [[decision—20260609—signage-broken-access-control]]
- [[concept—saas—multi-tenancy]]
- [[concept—core—role-based-access-control]]
- [[entity—core—permission-system]]
- [[incident—audit-suprema-signage]]