实时数据库规则语言中的Firebase速率限制

时间:2016-10-28 15:24:46

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


我目前正在尝试通过检查上一篇文章的时间戳来实现速率限制,然后向其添加+ 60秒,然后检查它是否小于(<)当前的Firebase服务器时间戳(现在)。 它不知何故总是返回true并授予访问权限?!

这些是我的规则:

{
  "rules": {
        "posts": {
        ".read": true,
            ".write": 
"(root.child('users').child(auth.uid).child('lastPost').val() + 60) < now"
      }
  }
}




这是我的数据库结构

{
    "posts": {
        "-KV70ppGGTEtXY4_Q4UC": {
            "author": "abcdedef-uid-ojifgoöifjgssgd",
            "description": "Thats the post description",
            "title": "Thats the post title"
        }
    },
    "users": {
        "2uy7323nTodMHcVxeEDJzoexH302": {
            "canPost": true,
            "email": "cryptic.pug@firebase.com",
            "lastPost": 14776667681,
            "profile_picture": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg",
            "username": "Cryptic Pug"
        }
    }
}

1 个答案:

答案 0 :(得分:2)

感谢你的线索弗拉基米尔!

由于我没有找到这种任何软件,我想在此正式分享答案:

    {
  "rules": {
        "posts": {
        ".read": true,
            ".write": 
"(root.child('users').child(auth.uid).child('lastPost').val() + 60000) < now"
      }
  }
}

说明:

当用户发布内容时,您始终会使用值firebase.database.ServerValue.TIMESTAMP将数据库中的值更新为用户信息。 在规则语言中,您读取了想要发布(FB规则语言中为auth.uid)并添加60秒(* 1000,因为Firebase在其时间戳中使用毫秒)的最后一个帖子的时间戳,将是允许用户再次发布的时间。然后检查当前服务器时间戳是否高于(<),而不是允许用户再次发布的时间。

希望它帮助了你们,Happy Coding - 做了3天的Firebase,这太棒了!