Saltar al contenido
Todos los artículos
4 min de lectura

Tu espacio de trabajo es una frontera de seguridad.

Por qué las comprobaciones de propiedad pertenecen a cada lectura y escritura, y por qué una URL de tarea nunca debe conceder acceso.

el equipo de supastack

Deriva la propiedad en el servidor

Un ID de registro identifica algo; no demuestra quién puede leerlo. supastack delimita los registros de usuario por workspaceId. El servidor resuelve el espacio del usuario autenticado e incluye ese límite al leer o modificar un registro.

No trates un ID de espacio enviado por el navegador como prueba de propiedad. El navegador puede pedir una acción, pero el contexto de servidor de confianza debe establecer de quién es. Esta regla debe valer para el estado de tarea, la configuración de proveedor guardada, los registros de uso y cada recurso propio del producto. Los layouts y componentes pueden filtrar lo que se renderiza, pero renderizar no es autorización — la comprobación pertenece al lugar donde el registro se lee o se escribe de verdad.

Todo lo demás en este post se sigue de esa regla: la propiedad se deriva, nunca se pide. En el momento en que un workspaceId enviado por el cliente es de fiar en algún sitio, cualquier otra comprobación se vuelve decoración. El post de autenticación cubre cómo se establece la sesión río arriba de esta frontera.

La membresía es parte de la frontera

El delimitado responde a qué espacio pertenece un registro; la membresía responde si este usuario pertenece a ese espacio. Resuelve ambas en el servidor. supastack modela espacios personales y de organización con roles de dueño, administrador y miembro — la guía de espacios de trabajo documenta el modelo.

Los roles añaden un segundo eje: un miembro puede leer lo que solo un administrador puede cambiar. Mantén las dos comprobaciones separadas — «pertenece a este espacio» y «puede ejecutar esta acción» — para que una degradación o expulsión haga efecto en la misma frontera que todo lo demás. Las invitaciones y expulsiones son parte del mismo ciclo de vida, no una idea tardía de administración.

Los cambios de membresía también tienen que hacer efecto de inmediato. La siguiente petición de un miembro expulsado debería fallar en la frontera, no cuando una credencial cacheada decida expirar — otra razón por la que la comprobación vive donde se leen los registros, en lugar de dentro de una credencial emitida antes.

Prueba las peticiones que deben fallar

Un test que deja a un propietario recuperar un registro demuestra el camino feliz. No demuestra el aislamiento. Combínalo con un segundo espacio pidiendo el mismo registro, una petición anónima y una escritura que intente sustituir a otro propietario.

Afirma el comportamiento externo tanto como el resultado persistido. Una petición rechazada no debe mutar los datos de otro espacio, y una respuesta de error no debe filtrar secretos ni detalles crudos de la base. Estas comprobaciones mantienen la frontera revisable cuando la implementación cambia.

  • Un segundo espacio pide el mismo ID de registro — rechazado.
  • Una petición anónima golpea el mismo endpoint — rechazada.
  • Un miembro expulsado del espacio reintenta — rechazado.
  • Una escritura nombra a otro dueño u otro espacio — rechazada, sin mutar nada.
  • Las respuestas de error se quedan genéricas — sin secretos, sin detalles de esquema.

Lleva la regla a tu producto

Cuando añadas una nueva tabla de producto, decide su propiedad antes de construir la pantalla. Incluye workspaceId en su modelo de persistencia, resuelve el espacio mediante la frontera de servidor existente y usa ese contexto tanto en operaciones de lista como de detalle.

Los workers en segundo plano exigen el mismo cuidado. Una tarea encolada debe llevar suficiente contexto de confianza para cargar el registro correcto, mientras las credenciales de proveedor permanecen en el servidor. Un job programado que carga filas por ID desnudo sigue dentro de la frontera. Una regla de propiedad consistente es más fácil de mantener que una colección de excepciones por ruta.

La superficie de API pertenece a la misma frontera. Las claves de API del espacio y los webhooks salientes firmados llevan consigo el ámbito del espacio — una clave nunca debe convertirse en una forma de leer entre tenants, y una carga de webhook nunca debe llevar registros del vecino. La guía del módulo de API cubre la forma de esa superficie.

Preguntas frecuentes sobre aislamiento de espacios

El aislamiento multi-tenant levanta el mismo puñado de preguntas en cada proyecto. Estas son las que conviene resolver pronto.

  • ¿Basta el delimitado a nivel de aplicación o necesito seguridad a nivel de fila? — El delimitado aplicado en el servidor en cada lectura y escritura cubre el modelo de amenazas de la mayoría de SaaS. RLS en base de datos añade defensa en profundidad, pero no sustituye las comprobaciones de frontera — los workers y las claves de API siguen necesitando la misma regla.
  • ¿Cómo debería funcionar compartir entre espacios? — Modélalo explícitamente — una invitación, una fila de membresía — en lugar de debilitar el ámbito. «Cualquiera con el enlace» debería ser una función diseñada con sus propias comprobaciones, no un accidente.
  • ¿Qué se rompe primero en las apps multi-tenant? — Las rutas de comodidad: enlaces de recuperación, herramientas de administración, workers en segundo plano que cargan registros por ID desnudo. Audita cada ruta de código que toca un registro sin pasar por el ámbito normal.
  • ¿Cómo añado delimitado a una tabla existente? — Añade workspaceId, rellénalo, hazlo valer en lecturas y escrituras y después toca la UI. Entrega primero los tests negativos para que la frontera quede demostrada en lugar de supuesta.
  • ¿Necesitan comprobaciones las acciones de servidor si la página está protegida? — Sí. Los guardas de página ocultan pantallas; no autorizan operaciones. Cada acción resuelve la sesión y el espacio de forma independiente.

Preguntas frecuentes

14 preguntas

¿Qué es supastack?

supastack es una base modular para construir productos SaaS con IA. Reúne la infraestructura común para que puedas centrarte en las funciones propias de tu producto.

¿Soporta web y móvil?

Sí. supastack incluye apps Next.js y Expo como puntos de partida para experiencias web y móviles.

¿Qué autenticación incluye?

Better Auth cubre correo/contraseña, OTP e inicio social. Los espacios de trabajo personales se aprovisionan con la cuenta para que los registros permanezcan delimitados desde el primer día.

¿Cómo se soporta la IA?

supastack incluye IA multi-proveedor configurable, seguimiento de uso, presupuestos y soporte cifrado de claves propias (BYOK).

¿Cómo se gestionan las suscripciones?

Para productos construidos sobre el kit, la facturación Stripe, las suscripciones y los permisos forman la base del acceso de pago. Los secretos de proveedor permanecen en el servidor.

¿Dónde vive el código propio de mi producto?

Las funciones propias del producto permanecen en un codebase separado, mientras el producto configura e integra los módulos base de supastack.

¿Cómo funciona el precio de supastack?

El kit es una compra única con actualizaciones de por vida: Un framework a 249 $ (precio de lanzamiento temporal — 100 $ de descuento sobre el precio habitual de 349 $) o Todos los frameworks (Next.js, iOS, Android) a 499 $ (precio de lanzamiento temporal — 100 $ de descuento sobre el precio habitual de 599 $), más 75 $ por plaza de desarrollador adicional. Sin suscripción al kit. El pago en este sitio entrega tu clave de licencia por correo, con acceso al repositorio por invitación de GitHub.

¿Cómo delimitan los espacios de trabajo mis datos?

Los registros del usuario se delimitan por workspaceId. Identidad, permisos, uso de IA, eventos de facturación y entradas de auditoría permanecen dentro del límite del espacio personal.

¿Cómo funcionan los jobs en segundo plano?

Trigger.dev es el runtime de jobs explícito. El contrato JobRunner solo promete enqueue, status y cancel — la semántica de workflow sigue siendo específica y explícita de Trigger.dev.

¿En qué se diferencia el email de la divulgación?

El email transaccional cubre flujos de producto como avisos de finalización de tareas. La divulgación en frío y las campañas pertenecen al producto, fuera del módulo de email de este kit.

¿Cómo funcionan las compras móviles?

La app móvil incluye compras nativas y restauración con RevenueCat, con acceso verificado por tu servidor. Configura las cuentas de las tiendas y completa las pruebas en dispositivos antes de publicar. La facturación web es independiente.

¿Dónde residen las claves de los proveedores de IA?

Las credenciales BYOK están cifradas y permanecen en el servidor. Las claves se saneen en los logs; el uso y los presupuestos siguen visibles a nivel de espacio de trabajo.

¿Qué métodos de pago acepta el checkout?

El checkout alojado en Stripe acepta tarjetas y, una vez activadas las billeteras en la cuenta de Stripe, también puede ofrecer Alipay y WeChat Pay — muy útil para compradores en China. Las autorizaciones de billetera se confirman de forma asíncrona, por lo que la página de la licencia se actualiza en cuanto se liquida el pago.

¿Puedo obtener un reembolso?

Una vez que tienes acceso al repositorio, supastack es tuyo para siempre, por lo que no se puede reembolsar. Pero no te preocupes: obtienes el código fuente completo con actualizaciones de por vida para crear y lanzar productos ilimitados para ti o tus clientes. Solo no puedes revender el código ni redistribuir el repositorio como plantilla o starter kit.

ES