【问题标题】:How to restrict documents number requested in Firestore security rules?如何限制 Firestore 安全规则中请求的文档数量?
【发布时间】:2019-01-20 16:11:26
【问题描述】:

我们正在为健身房和健身中心开发 SaaS 解决方案。

有 3 个包。第一个对他们在系统中添加的前 50 个成员免费。然后需要升级以添加更多成员。

有一个安全规则来防止在达到该限制后添加更多成员。问题是,如果订阅升级然后降级。

假设他们升级了,总共增加了 100 名会员,然后降级到仅包含 50 名会员的免费计划。

在这种情况下,我们希望他们只获得他们添加到成员集合中的最后 50 个成员。换句话说,我们希望限制对超过 50 个成员文档的请求的访问。

match /_users/{memberId} {
    allow read: if isMemberAuthenticated(memberId) || isGymAuthenticated();
    allow update: if isGymAuthenticated() || isMemberAuthenticated(memberId);
    allow create: if isGymPaid() && isGymAuthenticated();
}

我们考虑的解决方案是:

  • 在成员文档中有一个 ID 号,并限制对 ID
  • 拥有 Firebase Cloud 功能以请求成员文档并移除用户写入权限。这看起来像是 Firestore 的反模式。因为我们必须为用户对成员文档所做的任何更改实施云功能。

【问题讨论】:

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


    【解决方案1】:

    如果您不希望用户更新文档中的某些字段,您可以编写安全规则来检查用户是否没有更改该字段的值。问题是您目前无法阻止客户端尝试请求不使用 ID 字段作为过滤器的不同查询。您也不能使用安全规则从通常属于结果的查询中过滤(删除)文档。

    您可能希望研究使用request.query 来帮助限制查询中的文档总数,但这需要客户端限制他们自己的结果。

    使用 Cloud Functions 来控制对数据库的访问并不是一种反模式。有时有必要能够强制执行安全规则无法表达的事情。有时人们也会在添加无效数据后使用 Cloud Functions 触发器来删除或清理无效数据。

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2019-08-26
      • 2020-06-19
      • 2018-10-01
      • 1970-01-01
      • 2021-05-23
      • 2019-03-03
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多