【问题标题】:Firestore Database Rules: Permissions for QueriesFirestore 数据库规则:查询权限
【发布时间】:2018-03-21 14:51:48
【问题描述】:

我正在尝试根据字段查询文档。

由于这个字段,我确实有权阅读此文档:

match /lists/{list=**} {
    allow read: if resource.data.name == 'MyDocument'
}

如果我尝试直接检索此文档,则成功(使用 Kotlin 的 Android 客户端):

val doc = db.document("lists/acaa0247-eccd-4ff0-b986-7f8b6187e45f")
doc.get().addOnCompleteListener { task ->
            if (task.isSuccessful) {
                // here it works
                println("This Works")
            } else {
                println("Failed")
            }
        }

但是当我查询它(或者只是试图获取集合中的所有文档)时,我得到一个权限被拒绝的异常:

val collection = db.collection("lists")
collection.get().addOnCompleteListener(activity, { task ->
            if (task.isSuccessful) {
                println("Should work")
            } else {
                // Here is isn't working
                println("Failed")
            }
        })

当我允许所有人阅读/lists下的所有文档时,此查询有效:

match /lists/{list=**} {
    allow read: if request.auth != null
}

所以我的问题是:用户是否需要对查询中搜索的所有文档的读取权限? 在我的情况下,这意味着所有文档都包含/lists中的所有字段?

【问题讨论】:

    标签: firebase firebase-security google-cloud-firestore


    【解决方案1】:

    所以我的问题是:用户是否需要对查询中搜索的所有文档的读取权限?

    是的。

    为避免在查询列表时出现错误,在客户端可以使用 where 子句仅读取您有权读取的文档。

    【讨论】:

    • 那么当使用collection.whereEqualTo("name", "MyDocument").get() 时它应该可以工作吗?刚试了一下,我也得到了一个权限被拒绝的异常。
    • 非常好。然后您将创建一个索引,并在安全规则中确保用户确实具有访问权限。
    • 顺便说一句 @MarcelBochtler - 在此处查找查询语法:firebase.google.com/docs/firestore/query-data/queries
    • 我的查询语法不正确吗?因为使用规则 allow read: if resource.data.name == "MyDocument" 和查询 collection.whereEqualTo("name", "MyDocument").get() 它不起作用。名称是/lists/{listId}中文档中的一个字段
    • 发现问题:我实际上没有使用“MyDocument”作为名称,而是使用“Zähler”。改了,因为是德语。当我删除变音符号时,带有 where 子句的查询正在工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多