我在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
函数仅检查您指定的路径的子级键。在您的情况下,路径为applications/$appId/users
。
存储在applications/$appId/users
中的数据是一个数组,因此数组中每个项的键都是该项的索引。这就是为什么您的规则不起作用——您正在检查user_id_1
或user_id_2
,但数据中的密钥是0
和1
。没有电流等效于";数组包含";编写Firebase规则时。
一个解决方案是将applications/$appId/users
的数据结构更改为对象而不是数组。例如:
{
applications: {
id_1: {
feature: {
a: true,
b: false
},
users: {
user_id_1: true,
user_id_2: true
}
}
}
}
然后在规则中使用hasChild
将起作用,因为用户的id是applications/$appId/users
的子级。
关于您的安全性,需要注意的一点是:通过授予对所有$appId
的写访问权限,您就赋予了applications/$appId/users
中的任何用户编辑任何其他用户权限的能力。因为他们可以自由地读取/写入该位置的所有数据。