Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

186
Vistas
¿Existe un patrón de acceso que permita esta relación de varios a varios que pueda ser manejada por reglas de seguridad al usar Firestore onSnapshot?

He estado tratando de crear un sistema en el que los usuarios puedan asignarse a grupos y los grupos puedan asignarse a recursos . Si un usuario es miembro de un grupo en particular, ese usuario puede acceder a todos los recursos compartidos con ese grupo.

Un usuario puede ser parte de varios grupos y un recurso se puede compartir con varios grupos. Por ejemplo, un usuario puede ser parte de los grupos 'administradores' y 'equipo de desarrollo', y un recurso puede compartirse con los grupos 'marketing' y 'equipo de desarrollo'.

Una estructura de base de datos y una consulta que maneja con éxito esto es:

 <collection> [doc] <users> [userId]: { groups: [groupId, groupId...] } <groups> [groupId]: { members: [userId, userId...] } <resources> [resourceId]: { accessibleBy: [groupId, groupId...] }

y la consulta de Firestore:

 db.collection('/resources').where("accessibleBy", "array-contains-any", [...aUsersGroups])

Esto funciona muy bien. Sin embargo, donde esto se pone difícil es en las reglas de seguridad. Estoy usando oyentes onSnapshot y la regla que creé inicialmente (a continuación) falla, supongo que porque necesita verificar el acceso a cada documento en función del campo 'accesiblePor', lo que sería muy costoso computacionalmente al acceder a grandes colecciones.

 match /resources/{resourceId} { allow read: if resource.data.accessibleBy.hasAny(get(/databases/$(database)/documents/users/$(request.auth.uid)).data.groups); }

Vale la pena señalar que la regla anterior funciona para las solicitudes get() individuales de Firestore.

Algunas opciones que he considerado:

  • He contemplado normalizar nuestra estructura de datos por grupo, pero me imagino que esto requeriría mucha duplicación de datos que podría volverse inmanejable.
  • También he contemplado construir un sistema que solo use llamadas get() en lugar de oyentes, pero necesito actualizaciones en tiempo real (más o menos) y esto probablemente se volvería ineficiente.
  • Finalmente, he contemplado usar un entorno nodejs pero no estoy familiarizado con los patrones de acceso usando un servidor y todavía estaría buscando lograr la funcionalidad en tiempo real.

Estoy dispuesto a asignar usuarios solo a un grupo (o quizás a un grupo, más acceso de lectura predeterminado), pero necesito la funcionalidad para compartir recursos entre varios grupos.

Puede que Firestore no sea la respuesta a mis problemas aquí, pero pensé en preguntarle a la comunidad antes de buscar en otra parte. ¡Gracias de antemano! :)

about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda