Tengo un documento en Firebase estructurado así:
{ applications: { id_1: { feature: { a: true, b: false }, users: ['user_id_1', 'user_id_2'] } } } Quiero agregar una regla que asegure que solo los usuarios en la matriz de users puedan leer y escribir en la aplicación con id === id_1 .
He intentado agregar las siguientes reglas, pero aún parece que puedo leer y escribir datos cuando estoy conectado como user_id_3
{ "rules": { ".read": "now < 1643846400000", // 2022-2-3 ".write": "now < 1643846400000", // 2022-2-3, "applications": { "$appId": { ".write": "data.child('users').hasChild(auth.uid)", ".read": "data.child('users').hasChild(auth.uid)" } } } }¿Cómo puedo agregar una regla para dar acceso a un grupo de usuarios?
La función hasChild utilizada en su ejemplo de reglas solo busca claves que sean secundarias de la ruta que especificó. En su caso, la ruta es applications/$appId/users .
Los datos almacenados en applications/$appId/users son una matriz, por lo que la clave para cada elemento de la matriz sería el índice del elemento. Esta es la razón por la que su regla no funciona: está verificando user_id_1 o user_id_2 , pero las claves en sus datos son 0 y 1 . No existe un equivalente actual para "array contains" cuando se escriben reglas de Firebase.
Una solución sería cambiar la estructura de datos de applications/$appId/users para que sea un objeto en lugar de una matriz. Por ejemplo:
{ applications: { id_1: { feature: { a: true, b: false }, users: { user_id_1: true, user_id_2: true } } } } Luego, usar hasChild en sus reglas funcionará ya que la identificación del usuario es un hijo de applications/$appId/users .
Una cosa a tener en cuenta sobre su seguridad en general: al otorgar acceso de escritura a todo $appId , le está dando a cualquier usuario en applications/$appId/users la capacidad de editar el permiso de cualquier otro usuario. Ya que son libres de leer/escribir todos los datos en esa ubicación.