【发布时间】:2018-03-22 07:28:25
【问题描述】:
我想根据用户的电子邮件地址存储是否允许用户在文档本身中阅读文档。多个用户应该可以访问同一个文档。
根据the documentation Firestore 不允许查询数组成员。这就是为什么我将用户的电子邮件地址存储在 String-Bool Map 中,并以电子邮件地址作为键。
对于以下示例,我没有使用电子邮件作为映射键,因为它已经不适用于基本字符串。
数据库结构如下:
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
此处列出了所有安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
编辑:如果我使用match /lists/{listId} 而不是match /lists/{listId=**},它也不起作用
我的理解是,如果映射 shared[test] 中的值为 true,则此安全规则应该允许所有人进行读取访问。
为了完整起见:这是我正在使用的查询(Android 上的 Kotlin):
collection.whereEqualTo("shared.test", true).get()
.addOnCompleteListener(activity, { task ->
if (task.isSuccessful) {
Log.i("FIRESTORE", "Query was successful")
} else {
Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
}
})
我猜我无法从安全规则中访问映射值。那么我的问题的替代解决方案是什么?
在Firestore rules reference 中写到可以像resource.data.property == 'property' 那样访问地图所以,我做错了什么?
【问题讨论】:
-
我看到的所有关于 resource.data 的示例都没有 ** 通配符语法,所以也许 resource.data 只有在您使用
match /lists/{listId}而不是match /lists/{listId=**}时才有效?值得一试。 -
不,不幸的是这也不起作用
-
嗯...老实说;这看起来应该可以正常工作。您能否先仔细检查一下您是否不小心在实时数据库中而不是 Cloud Firestore 中存储数据/编辑规则? (有时会发生)另外,如果您不进行查询,而只是尝试获取单个文档,会发生什么情况?
-
@ToddKerpelman 数据在 Firestore 中。不是实时数据库。当直接使用
db.document("lists/acaa0247-eccd-4ff0-b986-7f8b6187e45f").get()阅读文档时,它可以工作。 -
这个问题仍然没有得到解决(2020 年 3 月),尽管评论最多。所以嵌套属性不起作用。由于我无法对此帐户发表评论,因此将其作为单独的答案发布。所以请不要在规则中使用嵌套属性。他们将与本地测试一起工作,但不是在部署之后。
标签: firebase firebase-security google-cloud-firestore