我们正在为体育馆和健身中心开发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();
}
我们考虑的解决方案是:
答案 0 :(得分:0)
如果您不希望用户更新文档中的某些字段,则可以编写安全规则以检查用户是否未更改该字段的值。问题是您当前无法阻止客户端尝试请求不使用ID字段作为过滤器的其他查询。您也不能使用安全规则从通常属于结果的查询中过滤(删除)文档。
您可能希望研究使用request.query来帮助限制查询中的文档总数,但这需要客户端限制自己的结果。
使用Cloud Functions限制对数据库的访问不是一种反模式。有时必须能够执行安全规则无法表达的内容。有时,人们还会使用Cloud Functions触发器来删除或清除无效数据,然后将其添加。