firebase - 基于 map 值的 Firestore 安全规则

标签 firebase firebase-security google-cloud-firestore

我想根据用户的电子邮件地址存储是否允许用户阅读文档本身中的文档。多个用户应该有权访问同一文档。

根据 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/

相关文章:

Firebase 安全规则 : "ruleset uses old version", 当前版本是什么?

typescript - Firebase 通过函数 : "7 PERMISSION_DENIED: Missing or insufficient permissions" 写入 Firestore 时出错

java - 从多个文档读取数据时多次触发Firestore Transaction

java - 实时数据库 Firebase 安全规则问题

java - 为什么我调用 API 或启动协程的函数返回空值或 null 值?

Firebase Firestore : Insufficient permissions to write

ios - 使用 FCM 推送通知在 ios ionic 中不起作用

Firebase 规则 : using parent values to validate?

node.js - "PERMISSION_DENIED: Missing or insufficient permissions"当使用 google 云任务调用 firestore 函数时

android - 如何在 Firebase 中设置数据类型验证?