如何向 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_1
或 user_id_2
,但数据中的键是 0
和 1
。在编写 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 该位置的所有数据。
我在 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_1
或 user_id_2
,但数据中的键是 0
和 1
。在编写 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 该位置的所有数据。