我想根据用户的电子邮件地址存储是否允许用户阅读文档本身中的文档。多个用户应该有权访问同一文档。
根据 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=**}
我怎么理解,如果 map 中的值
shared[test]
,这个安全规则应该允许每个人都可以读取。是真的。为了完整起见:这是我正在使用的查询(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}")
}
})
我猜我无法从安全规则访问 map 值。那么我的问题的替代解决方案是什么?
在 Firestore rules reference据说可以像这样访问 map
resource.data.property == 'property'
那么,我做错了什么?
最佳答案
编辑:现在应该修复这个问题。如果您仍然看到它(并且确定它是规则评估器的错误),请在评论中告诉我。
我已经与这里的一些人讨论过您遇到的问题,这似乎是安全规则本身的问题。从本质上讲,该问题似乎特定于评估查询中的嵌套字段,例如您正在执行的操作。
因此,基本上,您所做的应该可以正常工作,您需要等待 Firestore 团队的更新才能使此查询正常工作。发生这种情况时,我会尽量记住更新此答案。对不起!
关于firebase - 基于 map 值的 Firestore 安全规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674372/