Saltar a contenido

RBAC.md

Roles, Permisos, Scopes y Multi-tenant

1. Principio

Todo acceso está controlado por rol, pertenencia y scope. El multi-tenant no se agrega después: está diseñado desde los cimientos via django-tenants. Los feature flags se validan en el backend — el frontend nunca es la última línea de defensa.


2. Roles del sistema

Rol Scope Descripción
super_admin Global Administración del SaaS. Opera exclusivamente en esquema public. No accede a schemas de tenants via API
empresa_admin Tenant Administración completa del tenant: sucursales, usuarios, catálogo, configuración
sucursal_admin Sucursal Gestión de su sucursal: stock, caja, usuarios asignados. Sin acceso a otras sucursales
cajero Sucursal Operación del POS y apertura/cierre de caja de su sucursal. No ve el descuadre
vendedor Sucursal Operación del POS únicamente. Sin acceso a caja ni stock
viewer Sucursal Solo lectura en su sucursal asignada

3. Scopes

Scope Descripción
global Acceso total entre tenants. Solo super_admin
tenant Acceso a toda la empresa. Solo empresa_admin
sucursal Acceso a una sucursal específica
own Solo recursos propios del usuario

4. Matriz de permisos

Recurso Acción super_admin empresa_admin sucursal_admin cajero vendedor viewer
Empresas (Tenants) CRUD No No No No No
Suscripciones / Feature Flags Modificar No No No No No
Suscripciones Ver No No No No
Sucursales CRUD No No No No
Usuarios Crear / Asignar No No No No
Usuarios Ver No No No
Productos CRUD No No No
Productos Ver
Precios Actualización masiva No No No
Stock Ver
Stock Ajustar manualmente No No No
Caja Abrir No No
Caja Cerrar (ciego) No No
Caja Ver descuadre No No No
Ventas Crear No
Ventas Ver historial
Entidades Comerciales CRUD No No No
Importador masivo Ejecutar No No No
Reportes Ver No No

5. Reglas multi-tenant

  • super_admin nunca accede a schemas de tenants directamente via API de negocio.
  • Toda query en schema de tenant usa el search_path activo gestionado por django-tenants.
  • Un usuario puede tener roles distintos en distintas sucursales de la misma empresa.
  • Un usuario no puede inferir datos de otro tenant bajo ninguna circunstancia.
  • Los feature flags se validan en core_api antes de procesar cualquier operación avanzada.

6. Regla crítica — Cierre de caja ciego

  • El endpoint de cierre de caja nunca devuelve el saldo esperado al cajero.
  • El cajero solo puede declarar el monto físico contado.
  • El descuadre se calcula en el backend y es visible exclusivamente para sucursal_admin y superiores.
  • Cualquier endpoint que exponga el saldo esperado a un cajero es una violación de seguridad crítica.

7. Tests mínimos de permisos

Para cada endpoint sensible:

  • Usuario sin login no accede.
  • Usuario de otro tenant no accede.
  • Rol insuficiente recibe 403 Forbidden.
  • Cajero no puede ver el descuadre de caja.
  • Rol correcto accede y la acción queda auditada.

8. Prohibiciones

  • No confiar en filtros del frontend para determinar accesos.
  • No exponer el saldo esperado de caja al cajero bajo ningún formato.
  • No asumir que un usuario pertenece a una sola sucursal.
  • No devolver objetos de otro tenant aunque se conozca el ID.
  • No permitir operaciones avanzadas (Fase 2+) sin validar el feature flag en el backend.