如果允许用户根据用户的电子邮件地址阅读文档中的文档,我想存储.多个用户应该可以访问同一文档.
根据文档, Firestore不允许查询数组成员.这就是为什么我将用户电子邮件地址存储在String-Bool Map中,并将电子邮件地址作为密钥.
对于以下示例,我没有使用电子邮件作为映射键,因为它已经不能使用基本字符串.
数据库结构如下所示:
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
Run Code Online (Sandbox Code Playgroud)
此处列出了所有安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果我使用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}")
}
})
Run Code Online (Sandbox Code Playgroud)
我猜我无法访问安全规则中的地图值.那么什么是我的问题的替代解决方案?
我正在尝试创建一个允许用户在列表上进行协作的应用程序.需要邀请每个用户才能在列表中工作.
我构建了这样的数据(基于这篇博文).如果需要,也可以改变这种结构.
list
list_1:
users:
owner:
owner@company.com: true
shared:
user@company.com: true
user2@company.com: true
id
name
items:
item_1:
id:
name:
...
Run Code Online (Sandbox Code Playgroud)
我想要实现的目标:每个人都应该能够创建列表.然后,他们的创建者将成为创建列表的所有者.只有"共享"文档中的所有者和用户才能读取和写入此列表.
我想权限设置看起来应该是这样的.但这不起作用:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId}/{anything=**} {
allow read, write: if !exists(resource.data.users.owner) ||
resource.data.users.owner == request.auth.token.email ||
request.auth.token.email in resource.data.users.shared
}
}
}
Run Code Online (Sandbox Code Playgroud)