使用规则禁用 Firebase Cloud Firestore 中的查询集合

Posted

技术标签:

【中文标题】使用规则禁用 Firebase Cloud Firestore 中的查询集合【英文标题】:Disable querying collection in Firebase Cloud Firestore with rules 【发布时间】:2018-07-17 11:28:45 【问题描述】:

我正在使用 Firebase Cloud Firestore,我想修改我的规则以限制用户查询集合。

这是不允许的:

firestore().collection("users").get()

但这应该是允许的:

firestore().collection("users").doc("someUserId").get()

目前,我的规则如下所示:

match /users/userId 
    allow read;

但是这个规则允许查询“users”集合。

如何允许单个文档获取,但不允许集合查询?

【问题讨论】:

我认为您不能编写仅适用于集合的规则。如果您查看Firestore Security Rules Docs,您会注意到所有安全规则都应用于文档及其子集合。没有规则指定访问集合的条件。 是的,这就是我在阅读文档时的想法,但我想看看是否有人知道方法...... 是的,从文档中看很不清楚 - list 规则适用于集合。 【参考方案1】:

您可以将阅读规则分为 getlist。 get 规则适用于单个文档的请求,list 规则适用于查询和集合请求 (docs)。

match /users/userId 

  //signed in users can get individual documents
  allow get: if request.auth.uid != null;

  //no one can query the collection
  allow list: if false;

【讨论】:

文档中的另一个示例:firebase.google.com/docs/firestore/security/…【参考方案2】:

试试下面的。我无法测试它,如果我输入错误,请道歉。

match /users/userId 
    allow read: if $(request.auth.uid) == $(userId);

【讨论】:

我不明白这如何区分阅读集合和文档。 用户将只能访问 ID 等于其auth.uid 的文档。如果他们尝试 .get() 集合中的所有文档,它将不会返回任何内容。

以上是关于使用规则禁用 Firebase Cloud Firestore 中的查询集合的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Cloud Storage 规则能否针对 Firestore 数据进行验证?

Flutter firebase realtime db 在规则中使用 displayName

获取符合存储规则的 Firebase Cloud Storage 的客户端 URL

如何使用经过身份验证的 id 令牌和数据库规则保护 Firebase Cloud Function HTTP 端点?

Cloud Firestore 安全规则只允许从 Firebase 函数写入

Firebase Cloud Firestore 数据库规则数据访问被拒绝