Firebase Firestore - 基于“where”查询参数的安全规则

Posted

技术标签:

【中文标题】Firebase Firestore - 基于“where”查询参数的安全规则【英文标题】:Firebase Firestore - security rule based on "where" query parameters 【发布时间】:2019-10-25 07:56:30 【问题描述】:

我正在尝试保护对集合的请求以允许任何单个 get,但仅在匹配特定密钥时才允许 list

数据库结构是这样的:

posts
  post1
    content: "Post 1 content"
    uid: "uid1"
  post2
    content: "Post 2 content"
    uid: "uid1"
  post3
    content: "Post 3 content"
    uid: "uid2"

我从 Vue 进行的 Firestore 查询:

// Only return posts matching the requested uid

db
  .collection("posts")
  .where("uid", "==", this.uid)

我想要的安全规则是这样的:

match /posts/post 
  allow get: if true // this works
  allow list: if [** the uid in the query **] != null

我想这样做,以便您可以列出特定用户的帖子,如果您知道他们的uid,但无法列出系统的所有posts

有没有办法在安全规则中访问请求的.where(),或者在这种情况下如何编写这样的规则或构造我的数据?

相关和学分:

看起来,我可以在查询的limitoffsetorderBy 上提出请求。但是where 上什么都没有。见:#1 & #2。

我从this question 复制粘贴了很多内容。我看不出接受的答案如何回答这个问题。似乎它回答了另一种情况,即允许用户list 其他一些用户的帖子。那不是我的情况;就我而言,公开的就是公开的。所以,它似乎没有回答我的主要问题。

【问题讨论】:

【参考方案1】:

目前无法使用安全规则检查某个字段是否在查询中使用。您唯一能做的就是仅使用您允许的值验证文档字段是否被用作过滤器。

相反,考虑将足够的数据复制到另一个这样组织的集合中:

user-posts      (collection)
  uid         (document using UID as document ID)
     posts      (subcollection)
       postId (documents using post ID as document ID)

这将要求客户端调用一个 UID 进行查询,以获取与该用户关联的所有帖子。您可以根据需要存储尽可能多的有关发布文档的信息,以满足查询的目的。

像这样复制数据在 NoSQL 数据库中很常见。如果您不希望您的用户在任何给定时刻查询所有帖子,您甚至可能希望将此作为您的新默认结构。请注意,命名为“posts”子集合的collection group query 仍会查询所有用户的所有帖子,因此您必须make sure your security rules are set up 以便仅在您允许它发生时才启用它。

另请注意,UID 通常不会对用户隐藏,特别是如果您的网站本质上是协作的,并且您将多个用户的数据组合在一个页面上。

【讨论】:

(Y)。 “你必须写一个规则来限制它”,不应该是“确保你没有写一个规则来启用集合组查询吗?” ...因为默认情况下它们被禁用。 更清楚地说,您的规则应该只在您希望允许的地方允许集合组查询(可能永远不会)。

以上是关于Firebase Firestore - 基于“where”查询参数的安全规则的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore - 基于“where”查询参数的安全规则

Firestore/Firebase - 为关注/关注用户帖子建模数据的方法

如何在 Flutter 中使用 Firebase Auth 和 Firestore

SwiftUI UserDefaults 干扰 Firebase Firestore 数据

SwiftUI Lists + Firebase Firestore,获取数据然后取消获取? (漏洞)

基于角色的 Firestore 规则