Google cloud firestore Firestore规则-按字段保护数据

Google cloud firestore Firestore规则-按字段保护数据,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我的“提要”文档中有一个表示用户ID的字段。我想保护我的数据,这样只有用户才能用自己的用户ID读/写提要条目。其他一切-只要用户经过身份验证,就允许用户读/写 我对firestore有点陌生,但到目前为止,我有这样的想法: rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /feed/{feedItem} { allow read,

我的“提要”文档中有一个表示用户ID的字段。我想保护我的数据,这样只有用户才能用自己的用户ID读/写提要条目。其他一切-只要用户经过身份验证,就允许用户读/写

我对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;
    }
  }
}

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

这些规则将无法按您预期的方式工作

假设此处显示的字段名与文档中的字段名匹配,则限制对提要集合中文档的读取和写入的规则看起来没有问题

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

最好记住以下关于安全规则工作方式的声明:

  • 如果任何规则允许访问某个文档,那么将允许访问
  • 一旦某个规则允许对文档的访问,该访问就不能被另一个规则撤销

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

这些规则不会按你期望的方式工作

假设此处显示的字段名与文档中的字段名匹配,则限制对提要集合中文档的读取和写入的规则看起来没有问题

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

最好记住以下关于安全规则工作方式的声明:

  • 如果任何规则允许访问某个文档,那么将允许访问
  • 一旦某个规则允许对文档的访问,该访问就不能被另一个规则撤销

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

好的,这是有意义的-我还看到了,如果不是在feedItem中有userId,我会在前面有userId,这样路径就会像:/feed/{userId}/feed entries/{feedItem}这里的问题是,我认为firestore在一个特定的数据库中运行时不会超过三个级别——是这样吗?换句话说,一旦你在数据库中,你有一个集合,然后是你的文档,然后每个文档都是另一个集合-就这样,对吗?好的,这是有意义的-我还看到了哪里,而不是在feedItem中有userId,我会在前面有userId,这样路径就会像:/feed/{userId}/feed entries/{feedItem}这里的问题是,我认为firestore在一个特定的数据库中运行时不会超过三个级别-是这样吗?换句话说,一旦你进入了数据库,你就有了一个集合,然后是你的文档,然后每个文档都是另一个集合——就这样,对吗?