我如何创建一个规则来阻止用户添加比现在大的日期

时间:2019-04-21 12:35:21

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

我正在尝试在实时数据库中添加一条规则,以防止用户插入比现在大的日期。我当前在数据库中拥有的日期已转换为字符串。

这是我数据库中日期的示例:

  

“ Sun Apr 21 2019 14:14:00 GMT + 0200(heure d'étéd'Europe centrale)”

您将在下面找到我当前规则的一个示例。

关于如何从此处进行验证的任何线索? 谢谢

 {
    /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
    "rules": {
      "users":{
        "$uid":{
          ".read": "auth.uid == $uid",
          ".write": "auth.uid == $uid",
          "exercices":{
          "developpeIncline":{
                "$developpeInclineId":{
                    "date":{
                     ".validate":"newData.val() <= now"  // blocks everything at the moment
                  },
                 "reps":{
                   ".validate":"newData.val().length < 3"
                 }
              }
          }
          }
        }
      }
    }
  }

1 个答案:

答案 0 :(得分:0)

Firebase的安全规则中的now变量为documented,如下所示:

  

根据Firebase实时数据库服务器,包含自Unix时代以来的毫秒数。

由于您将日期存储为字符串,因此您的规则现在将比较不同的类型:

"Sun Apr 21 2019 14:14:00 GMT+0200 (heure d’été d’Europe centrale)" <= 1555855344955

这种比较永远不会是正确的,因为比较字符串和数字永远不会得到有用的结果。

您将需要编写代码以使值具有相同的类型,以便进行比较。而且由于日期与字符串的比较不容易,这意味着您需要将字符串转换回日期或数字时间戳。

我认为Firebase的安全规则中不可能做到这一点。但是即使有可能,我也强烈建议您选择一种更好的方法。将您的日期存储为时间戳:

developpeInclineRef.child("timestamp").set(date.getTime());

developpeInclineRef.child("timestamp").set(Date.now());

这样,比较变得微不足道了:

"timestamp": {
  ".validate":"newData.val() <= now"
},

如果您也想以显示格式存储日期,请考虑以两种格式存储日期:作为时间戳和字符串。