【问题标题】:Firestore rules on object data type对象数据类型的 Firestore 规则
【发布时间】:2017-11-30 12:14:43
【问题描述】:

数据库有一个集合“Collection”,集合中的每个文档都有一个对象“members”,其中包含有权访问该文档的用户的“uid”。

Collection--->document-->members = {"BZntnJO2PVS8OZ9wctwHiyxBytc2": true} 

我尝试了许多不同类型的规则,但这些规则似乎都不起作用

service cloud.firestore {
  match /databases/{database}/documents {
  match /collection/{documentId} {
         allow read: ****
 }
}

1)

allow read: if get(/databases/$(database)/documents/collection/$(documentId)).members[request.auth.uid] != null

2)

allow read: if resource.data.members[request.auth.uid] != null

3)

allow read: resource.members[request.auth.uid] != null

4)

allow read: if request.resource.data.members[request.auth.uid] != null

5)

allow read: request.resource.members[request.auth.uid] != null

这可能是 Firestore 错误吗?

【问题讨论】:

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


    【解决方案1】:

    您需要访问 data 属性才能获取任何用户创建的属性,因此规则 1、3 和 5 将不起作用。

    request.resource 通常是指您发送到数据库的数据,通常是在写操作的情况下,所以规则#4 不起作用,因为request.resource.data 在这种情况下可能为空阅读。

    规则 #2 看起来确实正确,但请记住,这仅适用于获取单个文档的情况。查询有点棘手。

    具体来说,如果您正在运行一般的“获取我的集合中的每个文档”类型的查询,Cloud Firestore 没有时间搜索数据库中的每条记录以确保您的用户具有访问权限,因此它将拒绝此查询。相反,您需要运行一个查询,Cloud Firestore 可以“证明”您检索的所有文档都是有效的。例如,在您的情况下,您需要确保您的查询类似于“获取我的集合中的每个文档,其中成员。(用户 ID)!= null”。然后,Cloud Firestore 规则可以将您的查询与其规则进行比较,并对您只会获得您有权访问的文档感到满意。

    【讨论】:

    猜你喜欢
    • 2020-01-21
    • 2019-01-09
    • 2018-05-25
    • 2018-04-04
    • 1970-01-01
    • 2018-10-10
    • 2018-08-18
    • 2020-02-24
    • 2019-11-20
    相关资源
    最近更新 更多