如果允许用户根据用户的电子邮件地址阅读文档本身的文档,我想要存储它。多个用户应该可以访问同一个文档。根据the documentation Firestore不允许查询数组成员。这就是为什么我要将用户电子邮件地址存储在String-Bool Map中,并将电子邮件地址作为关键字。基于地图值的Firestore安全规则
对于下面的示例,我不使用电子邮件作为映射键,因为它已经不适用于基本字符串。
数据库结构看起来像这样:
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]
中的值为真,则此安全规则应允许读取所有人。
对于completness缘故:这是我使用的查询(科特林在Android):
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所看到的所有示例都没有**通配符语法,所以如果您使用'match/lists/{listId}'而不是'match/lists/{listId = **}'?值得尝试的东西。 – Scarygami
不,不幸的是,这也是行不通的 –
嗯......我会诚实的;这看起来像这应该工作正常。您是否可以首先仔细检查一下,您是否意外存储了数据/将规则编辑到实时数据库而不是Cloud Firestore中? (它有时会发生)另外,如果您不做这个查询并尝试获取单个文档,会发生什么? –