javascript - 如何限制 Firestore 安全规则中请求的文档数量?

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

我们正在为健身房和健身中心开发 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 < subscription allowed 的任何请求的访问。问题是用户可以访问成员文档,因此可以更改他们的 ID。
  • 拥有 Firebase Cloud 功能来请求成员文档并删除用户写入权限。这看起来像是 Firestore 的反模式。因为我们必须为用户对成员文档所做的任何更改实现云功能。

最佳答案

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

您可能想查看 request.query 的使用帮助限制查询中的文档总数,但这需要客户限制自己的结果。

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

关于javascript - 如何限制 Firestore 安全规则中请求的文档数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54278354/

相关文章:

Flutter:Streambuilder 导致 Firestore 上的读取过多

angular - 如何在 firestore 中保存日期值

javascript - jQuery 1.3.2 是否有可用的 md5 插件或等效的加密插件?

javascript - 从 Ajax 调用 Jquery 访问数据

javascript - 使用 javascript 更改 css 值

javascript - 为什么在原型(prototype)而不是构造函数中声明实例属性?

ios - 如何在 iOS 中使用 Google Firebase 向特定用户发送推送通知?

ios - 如何按内部子项对 Firebase 快照进行排序

android - React Native 应用程序 - Google 登录

reactjs - cleanup() 在 useEffect() 中无法使用 Firebase Firestore onSnapshot