【问题标题】:Firestore security rule - how to secure subcollection?Firestore 安全规则 - 如何保护子集合?
【发布时间】:2020-05-08 21:15:25
【问题描述】:

我想问一下保护 Firestore 子集合的最佳方法是什么。

这是我的问题:我有一个用户集合,其中有一个名为用户 ID 的文档。我在该文档中也有一个集合,其中包含一些信息,包括用户 ID(再次)。是否有一种简单的方法可以访问嵌套在用户文档的子集合中的每个文档?

到目前为止,我写了以下内容。我可以访问第一个文档(名为 i6mg 的文档......但不能访问名为 DxDt 的第二个文档......)

  match /users/{user} {
  allow read: if resource.data.userId == request.auth.uid;
  allow write: if false;

    match /wordScores/{doc} {
    allow read : if resource.data.userId == request.auth.uid;
    allow write;
    }

    match /groupScores/{doc} {
    allow read: if resource.data.userId == request.auth.uid;
    allow write;
    }

  }

额外的问题:有没有一种方法可以保护所有文档,而无需在每个文档中都包含用户 ID?

谢谢

编辑 感谢道格的建议。我添加了以下代码,并且可能遇到了其他一些问题......

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
        match /users/{uid}/{document=**} {
          allow read: if uid == request.auth.uid;
          allow write: if uid == request.auth.uid;
        }
  }
}

看起来我正在让我的用户访问子集合,而不是主集合。例如以下代码不会产生结果,它会捕获异常

await Firestore.instance.collection('users').where('userId', isEqualTo: userId).limit(1).getDocuments();

有什么建议吗?

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    如果您使用用户的 UID 作为其顶级文档的 ID,并且您希望所有子集合中的所有文档都具有与该文档相同的访问权限, 使用递归通配符:

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{uid}/{document=**} {
          allow read: if uid == request.auth.uid;
        }
      }
    }
    

    您必须使用安全规则版本 2 才能获得递归通配符语法。请注意,常规通配符只是成为您可以直接在规则中使用的变量。您不必像现在一样进入文档字段。

    【讨论】:

    • Doug Stevenson,起初我忘记添加 'rules_version = '2'' 但它仍然有效。这怎么可能?如果我添加版本 2,则它不起作用。这是我尝试访问用户集合时出现的错误:PlatformException(Error 7, FIRFirestoreErrorDomain, Missing or enough permissions.)
    • 它适用于子集合,但不适用于主集合。
    • 明白了!那么您对如何添加规则以授予对主用户集合的读取权限有什么建议吗?我希望每个用户在用户集合中阅读他们的文档(命名为他们的 uid)以及任何子集合中的所有其他文档
    • 我展示的内容应该适用于规则版本 2。你是说不能使用版本 2?您必须更具体地说明您正在做的事情并没有按照您期望的方式工作。
    • 您的查询现在对规则无效。我提出的规则只允许 UID 匹配的单个文档 get()。如果您已经知道文档的 ID,则无需使用 where 子句执行查询。如果您确实需要允许对 userID 字段进行过滤,则需要调整规则以查看文档字段以及文档 ID。
    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 2021-01-10
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多