【问题标题】:Firestore rules - securing data by fieldFirestore 规则 - 按字段保护数据
【发布时间】:2019-11-25 02:38:31
【问题描述】:

我的“提要”文档中有一个字段表示 userId。我想保护我的数据,以便只有用户可以使用自己的 userId 读取/写入提要条目。其他一切 - 只要用户经过身份验证,就允许用户读/写。

我对firestore有点新,但到目前为止我有这样的东西:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /feed/{feedItem} {
        allow read, write: if request.auth.uid == resource.data.userId
    }
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

不幸的是,这仍然允许对所有内容进行读/写访问,包括提要项。

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    这些规则不会按您预期的方式发挥作用。

    假设此处看到的字段名称与文档中的字段名称匹配,您限制对提要集合中文档的读取和写入的规则看起来不错。

    但是,您对 match /{document=**} 的“其他所有内容”的规则不正确。无论您的其他规则是什么,此规则始终匹配整个数据库中的每个文档。因此,正如您现在所写的那样,每个用户仍然可以读取和写入每个文档,包括“提要”中的文档,因为该规则始终允许这样做。

    请记住以下有关安全规则工作方式的陈述:

    • 如果任何规则允许访问某些文档,则将允许访问。
    • 一旦某个规则允许访问文档,该访问权限就不能被其他规则撤销。

    事实上,安全规则无法指定与其他规则相关的“其他所有内容”。相反,您需要做的是在其自己的规则中按名称调用每个集合,并为其分配访问权限。是的,如果您有很多收藏,这很麻烦,但这是您唯一的选择。

    【讨论】:

    • 好的,这是有道理的 - 我也看到了在 feedItem 中没有 userId 的地方,我会将 userId 放在前面,这样路径就像:/feed/{userId} /feed entries/{feedItem} 这里的问题是,一旦您进入特定数据库,我认为 Firestore 不会超过三个级别 - 是这样吗?换句话说,一旦您进入数据库,您就有了一个集合,然后是您的文档,然后每个文档就是另一个集合 - 就目前而言,对吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多