如何向 firebase 添加规则以授予一组用户 ID 访问路径的权限?

How to add rule to firebase to give a group of user ids access to a path?

我在 Firebase 中有一个结构如下的文档:

{
  applications: {
    id_1: {
      feature: {
        a: true,
        b: false
      },
      users: ['user_id_1', 'user_id_2']
    }
  }
}

我想添加一条规则,确保只有 users 数组中的用户可以读取和写入 ID === id_1.

的应用程序

我已经尝试添加以下规则,但在以 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)"
      }
    }
  }
}

如何添加规则以授予一组用户访问权限?

您的规则示例中使用的 hasChild 函数仅 检查键 是您指定路径的 children。在你的例子中,路径是 applications/$appId/users.

存储在 applications/$appId/users 的数据是一个数组,因此数组中每个项目的键都是项目的索引。这就是您的规则不起作用的原因 - 您正在检查 user_id_1user_id_2,但数据中的键是 01。在编写 Firebase 规则时,当前没有“数组包含”的等效项。

一个解决方案 是将 applications/$appId/users 的数据结构更改为 object 而不是数组。例如:

{
  applications: {
    id_1: {
      feature: {
        a: true,
        b: false
      },
      users: {
        user_id_1: true,
        user_id_2: true
      }
    }
  }
}

然后在您的规则中使用 hasChild 将起作用,因为用户的 ID 是 applications/$appId/users 的 child。

关于一般安全性的注意事项: 通过授予对所有 $appId 的写访问权限,您向 applications/$appId/users 的任何用户授予能够编辑任何其他用户的权限。因为他们可以免费 read/write 该位置的所有数据。