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

时间:2019-10-25 07:56:30

标签: firebase google-cloud-firestore angularfire2 firebase-security

我正在尝试保护对集合的请求,以允许任何单个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 个答案:

答案 0 :(得分:1)

当前无法使用安全规则来检查查询中是否使用了字段。您唯一可以做的就是仅使用您允许的值来验证文档字段是否已用作过滤器。

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

function createTestCafe(...)

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

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

还请注意,通常不会向用户隐藏UID,尤其是如果您的网站本质上是协作的,并且您在单个页面上合并了多个用户的数据。