【问题标题】:Firestore Rule - limiting "list" accessFirestore 规则 - 限制“列表”访问
【发布时间】:2021-02-08 23:02:04
【问题描述】:

我有一个收藏,我想提供列表访问权限,但仅限于大多数用户。

所有用户都应该能够做到这一点:(字符串valuex可以是任何东西)

collection("XYZ").where("fieldx", "==", "valuex").get()

只有管理员可以获取所有文档:

collection("XYZ").get()

请注意,valuex 可以是任何东西,所以最终所有用户都可以看到所有文档。不同的是,非管理员需要知道要查询什么,而管理员不需要,他们可以直接得到。

我找到的唯一解决方案是强制非管理员在调用get 之前将他们正在查询的值写入文档。那么规则是:

allow list: if isadmin() || resource.data.fieldx == getvaluex();
function isadmin() { return request.auth.token.get("admin", false); }
function getvaluex() { return get(/databases/$(database)/documents/users/$(request.auth.uid).data.valuex; }

这样,所有返回的文档必须具有相同的 fieldx 值。但是这个解决方案 1) 需要 1 次额外写入 2) 在规则中添加读取 3) 在我的情况下,valuex 是敏感的,我不希望用户必须将其存储在 Firestore 中。

那么有没有更好的解决方案?

  • 是否可以将索引的使用限制为仅限某些用户使用? (上述两个查询实际上都有更多的 where 语句,并且每个查询都需要一个特定的复合索引)。
  • 是否可以相互比较返回的文档以确保它们都具有相同的 fieldx 值?

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    我会这样做:

    1. 根本不允许非管理员向数据库发出这些直接请求。

    2. 相反,让他们向 Firebase Http 函数发送请求。

    3. Http函数对数据库有管理员权限,它可以接受任何值x 非空值。

    4. 它代表非管理员用户使用该 valuex 查询数据库,并返回结果。

    这样,您可以在 Firestore 规则中将 XYZ 集合中的文档锁定给非管理员。

    您甚至可以在这些文档中保留敏感数据,因为您可以控制与用户共享的内容。您可以通过选择您的 HTTP 函数将返回给客户端的字段来控制它。

    请注意,Firebase 函数调用比进行额外的写入/读取要便宜得多。

    【讨论】:

    • “请注意,Firebase 函数调用比进行额外的写入/读取要便宜得多。”?真的吗?我以为是相反的
    • 读/写按 100K 定价,函数按 1M 定价。此外,您每月可获得 200 万次免费调用。
    • @MarketerInCoderClothes 当您从 Cloud Function 访问 Firestore 数据时也需要付费,因此使用云函数更多。
    • @Juancki 在 OP 的情况下它更便宜,因为他不会像他正在考虑的解决方案中那样使用任何 Firestore 规则读取或任何额外的文档写入。
    • 不幸的是,我的应用也有几个关于这个集合的快照,所以用户需要有一些访问权限
    【解决方案2】:

    Firestore 非常适合从客户端轻松/标准化地访问集合和文档。

    您正在尝试做的事情非常具体到您对这些“列表”的实现。

    您可以创建另一个集合 (list_auth) 来跟踪对列表的访问。

    在安全访问中,您可以为该集合创建一个安全规则,通过访问list_auth 集合将user 的权限查找到list 中。

    https://firebase.google.com/docs/firestore/security/rules-conditions#access_other_documents

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2021-06-13
      • 2019-08-20
      相关资源
      最近更新 更多