Volver a la wiki

Decisión arquitectónica · Unificación de gates con `require_perm` en network (sa4)

Contexto

Antes de sa4, el módulo network mezclaba tres patrones de autorización:

  1. is_admin(request.user) — binario, no granular.
  2. request.user.role directo — acoplamiento a esquema de roles.
  3. Sin gate — endpoints públicos sin intención clara.

Esto causaba:

Decisión

Usar require_perm(request, scope: str, level: str) de core.utils como función defensiva única para autorizar en toda la sub-área network.

# Antes
if not is_admin(request.user):
    return 403, {...}

# Después
require_perm(request, "network", "edit")  # levanta 403 si falla

Niveles de permiso en network

network:view   → lectura de metadatos (listas, estado, sin secretos)
network:edit   → lectura de secretos + mutación de configuración + device status
network:admin  → mutaciones de backup + delete group + health check

Implementación (sa4)

Endpoints view (lectura sin secretos)

Endpoints edit (lectura de secretos, mutación)

Endpoints admin (mutaciones peligrosas)

Por qué require_perm es mejor

AspectoAntesCon require_perm
Granularidadview/edit/adminExplícita por endpoint
Fail-safeFalta gate → vulnerableFalta gate → NameError → fix rápido
Acoplamientorequest.user.role directoCentralizado en core.utils
ErroresAttributeError 500403 Forbidden limpio
TestingMezcla de fixturesviewer_user, operator_user, admin_user reutilizables

Trade-offs

Próximos pasos

Véase también

Subir