[英]How to perform server validations based on query results with Firebase?
插入记录时,我需要能够在服务器上运行一个或多个查询,如果发现任何结果,它将拒绝插入。 Firebase可以允许我这样做吗? 无法在客户端上指定它,或者可以轻松地将其颠覆。
举一个更具体的例子,我有一个Meteor应用程序,目前让我用一些非常简单的代码对投票进行速率限制。 我想在Firebase中实现这一点。 (请原谅CoffeeScript)
@VoteFrequency =
votesPer: (sinceDelta, sinceUnit) ->
Votes.find(
pollId: @pollId
ip: @ip
createdAt:
$gte: moment().add(-sinceDelta, sinceUnit).toDate()
).count()
withinLimits: (ip, pollId) ->
@ip = ip
@pollId = pollId
# Allow x votes per y seconds
@votesPer(10, 'seconds') < 1 &&
@votesPer(1, 'hours') < 15 &&
@votesPer(1, 'days') < 150
如您所见,它在数据库中查询与IP地址匹配且比时间戳更新的以前的投票(使用当前时间的差值来计算-时间间隔)。 如果发现任何这些限制的结果,则返回false,这告诉呼叫者不要插入新的投票。
需要明确的是,我并不是在寻找将自己的服务器添加到服务器中的解决方案。 一旦我必须这样做,FireBase至少对我失去了很多吸引力。
到目前为止,据我所知,这似乎并不是仅凭浏览器/本机客户端和firebase就可以实现的功能。
您不能在Firebase的服务器上运行自己的代码。 因此,尝试将现有的三层解决方案映射到Firebase不仅需要评估如何移植每个脚本,还需要更多。
据我可以看到的这些主要选项:
我认为#1是明确的,尽管肯定不是很简单。 例如:Firebase的安全规则无法访问客户端的IP地址,因此您必须找到一种方法(安全地)将其插入数据中。 另外: 在Firebase安全规则中可以进行速率限制 ,但这并不容易。
#2可能也很清楚。 但这会让您使用自定义中间件来保持当前的三层体系结构。 您只需用Firebase替换当前的数据存储即可。 如果这就是您要寻找的,那肯定是最简单的迁移方法。
#3在此博客文章的模式2中进行了描述。 在这种情况下,您可以考虑让客户端将其投票和IP地址写入“登台”节点。 然后,机器人脚本会从登台区域读取它们,验证它们是否在规则内,并写入正式节点(普通客户端无法访问)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.