我正在尝试在实时数据库中添加一条规则,以防止用户插入比现在大的日期。我当前在数据库中拥有的日期已转换为字符串。
这是我数据库中日期的示例:
“ 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"
}
}
}
}
}
}
}
}
答案 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"
},
如果您也想以显示格式存储日期,请考虑以两种格式存储日期:作为时间戳和字符串。