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:
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! :)