【问题标题】:What's the best way to do more complex validation in firebase realtime database?在 firebase 实时数据库中进行更复杂验证的最佳方法是什么?
【发布时间】:2021-04-29 17:52:34
【问题描述】:

tldr:由于 firebase RTDB 安全规则仅支持单语句条件且允许的变量非常有限,我无法检查是否允许用户提交。我该怎么办?

我正在制作一个简单的游戏,用户可以在其中进行天气预报(“猜测”)。目前,可以对明天和后天进行猜测(我可能还会添加对接下来几个小时进行短期预测的能力)。下面是我的数据库中的猜测。例如,显示的猜测意味着已提前一天('d1')预测 2021 年 1 月 26 日(30,-20)的龙卷风。长字符串是用户ID。

我想阻止用户发送当天或已经发生的一天的猜测(如果我添加该功能,同样适用于几个小时)。验证已经在客户端实现,但显然我需要检查服务器。 但是,我无法使用 RTDB 安全规则执行此操作,因为唯一的时间变量是 now,即自 Epoch 以来的毫秒数。我能想到的选项是:

  1. 以某种方式重组数据库,以便我可以使用now 变量进行比较。这可能很复杂/不可能。
  2. 为可以验证的每个猜测调用 Firebase 云函数。我担心这可能会导致大量函数调用。

有没有“正确”的方法来解决我的问题?有没有我没有想到的选项?一般有什么建议吗?

【问题讨论】:

    标签: firebase security firebase-realtime-database firebase-security


    【解决方案1】:

    确定今天的开始时间(以毫秒为单位)应该是可能的:

    Math.floor(now / (24*60*60*1000)) * (24*60*60*1000)
    

    我实际上不确定Math 在安全规则中是否可用。如果没有,您也许可以通过类型转换或正则表达式获得类似的结果。

    如果您想让它在您的实时数据库中可重复使用,请考虑使用 Firebase 的 Bolt preprocessor,它支持 functions

    【讨论】:

    • 数学不可用。以下是所有可用的功能:firebase.google.com/docs/reference/security/database 我会看看是否可以通过规则来实现。
    • 那么您是否建议不要调用 Firebase 云函数?它宁愿只使用安全规则进行验证?
    • 一点也不。使用 Cloud Functions 作为中介是一种完全有效的方法。我只是更喜欢不需要 Cloud Functions 的解决方案,因为它们通常在用户离线时更容易继续工作。
    • 是的。对于可能有类似问题的任何人:我更改了将猜测添加到数据库的方式。我用最新的now 值替换了路径中的 YYMMDD 格式(例如“210126”),在该值可以提交对该时间范围的猜测。这使得将该值与 RTDB 安全规则提供的 now 变量进行比较变得非常容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多