Volver a la wiki

Servicio has_permission — Evaluador de permisos multi-capa

Resumen

Función central de evaluación de permisos en el núcleo. Verifica si un usuario tiene acceso a una acción específica (scope/level) según una jerarquía de cuatro capas.

Función: core.utils.permissions.has_permission(user, scope: str, level: str = "view") -> bool

Módulo: core/utils/permissions.py

Arquitectura de evaluación (4 capas)

1. Role-based defaults (SaaSModule + Plan)
   ↓ (si existe)
2. TemporaryAccess (grants temporales por tiempo limitado)
   ↓ (si existe + si DB disponible)
3. ModulePermission (overrides explícitos por usuario)
   ↓ (si existe + si DB disponible)
4. Fallback a role defaults

Primero se evalúa rol; si hay grant temporal o override explícito, se usa. Si no, vuelve a los defaults del rol.

Parámetros

Retorno

Orden jerárquico de niveles

LEVEL_ORDER = {"view": 1, "edit": 2, "admin": 3}

Nivel edit incluye view. Nivel admin incluye edit y view.

Requisitos de seguridad (s104) — Fail-open fix

Problema histórico: Los bloques try/except de TemporaryAccess y ModulePermission tragaban toda excepción con except Exception: pass, incluyendo errores inesperados de BD. Esto causaba un fail-open silencioso: ante un error BD imprevisto, el usuario caía a los defaults del rol (potencialmente más permisivo que una denegación explícita).

Fix (s104, 2026-06-02):

Casos de uso

Corrección 06-09-2026 (task #279, v1.118.0, commit b160abd9): core/htmx_device_groups.py (grupos de dispositivos) exigía has_permission(request.user, "racks", level) — dominio equivocado, copiado de los mutadores de racks de arriba. Un grupo de dispositivos es dominio “network”, no “racks”: ahora network:edit al crear y network:admin al borrar, alineado con sus gemelos de la API Ninja (network/api/device_groups.py::create_device_group/delete_device_group). Se añadió también log_action en ambos mutadores, que no lo tenían.

Tests

Véase también

Subir