相关疑难解决方法(0)

基于映射值的Firestore安全规则

如果允许用户根据用户的电子邮件地址阅读文档中的文档,我想存储.多个用户应该可以访问同一文档.

根据文档, 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规则参考中 …

firebase firebase-security google-cloud-firestore

13
推荐指数
1
解决办法
3100
查看次数

Firestore 规则和使用电子邮件密钥查询文档映射以与用户共享数据

用例摘要

  1. 用户 A 创建一个故事
  2. 用户 A 通过电子邮件(通过云功能发送)与未知(向应用程序)用户 B 分享故事
  3. 用户 B 收到有关该故事的电子邮件
  4. 用户 B 访问应用程序并创建一个新帐户
  5. 用户 B 查看/阅读用户 A 创建的故事

注意:故事只能被分享给谁或由谁创建

我正在构建一个基于角色的访问系统。我一直在查看基于角色的访问 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)

firebase firebase-security google-cloud-firestore

2
推荐指数
1
解决办法
2090
查看次数