如果允许用户根据用户的电子邮件地址阅读文档中的文档,我想存储.多个用户应该可以访问同一文档.
根据文档, 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)
我猜我无法访问安全规则中的地图值.那么什么是我的问题的替代解决方案?
用例摘要
注意:故事只能被分享给谁或由谁创建
我正在构建一个基于角色的访问系统。我一直在查看基于角色的访问 firestore 文档,但我遗漏了一件。
考虑一个故事,该故事只能由已共享该故事的用户阅读。大多数示例包括 firestore 示例使用UIDhas 密钥来识别共享用户。但是,该用户当前可能不是 firebase 应用程序的用户,另外用户如何分配该 UID。
故事数据
{
title: "A Great Story",
roles: {
aliceUID: {
hasRole: true,
type: "owner",
},
bobUID: {
hasRole: true,
type: "reader",
}
}
}
Run Code Online (Sandbox Code Playgroud)
故事查询
firebase.firestore().collection('stories').where(`roles.${user.uid}.hasRole`, '==', true)
Run Code Online (Sandbox Code Playgroud)
第二部分可能通过维护一个单独的用户集合来解决,然后您可以从他们的电子邮件地址中找到用户,但这并不能解决从未登录过的用户。
打算分享故事的用户可以添加具有电子邮件地址的用户。然后使用 firebase 函数,我们可以发送电子邮件通知用户共享故事,用户可以登录应用程序并阅读该故事。
如果我们继续使用这种方法,那么您将没有 UID,而只有一个电子邮件地址作为密钥。
故事数据
{
title: "A Great Story",
roles: {
alice@yahoo.com: { …Run Code Online (Sandbox Code Playgroud)