限制非高级用户每天仅写入Firebase数据库一次

时间:2019-01-28 11:58:48

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

我想将非高级用户限制为每天仅发布一则帖子。高级用户没有限制。我不清楚如何设置数据库规则。目前,我只有经过验证的用户可以发布到数据库。 请注意我要写入AddPost节点

我的数据库Json看起来像这样:

User :
   uid:
      verified : true
      premium : false

我的规则:

{
  "rules": {
  "AddPost": {
     ".read": "auth != null",
      ".write": 
"root.child('Users').child(auth.uid).child('verified').val() == true"
 }  
    ,"Users": {
      ".read": "auth != null",
        ".write": "auth != null"
    }
    ,"FavoritedBusinesses": {
      ".read": "auth != null",
        ".write": "auth != null"
    }
    ,"Geolocs": {
       ".read": "auth != null",
        ".write": "auth != null"
    }
    ,"ReviewPost": {
      ".read": "auth != null",
      ".write": "auth != null"
    }
     ,"Views": {
      ".read": "auth != null",
      ".write": "auth != null"
    }

   }


}

我的解决方案 因此,使用弗兰克斯指南,我可以将一些规则组合在一起。作为基本规则,必须验证每个用户,因此我将其作为“公分母”置于“验证”条件下。然后在写操作中首先检查该用户是否为溢价(如果它返回false),然后检查最后一个我们存储在上一篇文章中的时间戳。但是,如果第一个条件失败,则意味着该用户实际上是高级用户,应被允许发布。

新数据库规则

".write": "root.child('Users').child(auth.uid).child('premium').val() 
=== false && (newData.parent().child('Users').child(auth.uid).child('lastPostStamp').val() === now) && (newData.parent().child('Users').child(auth.uid).child('lastPostStamp').val() > root.child('Users').child(auth.uid).child('lastPostStamp').val() + 24*60*60*1000) || root.child('Users').child(auth.uid).child('premium').val() === true ",
        ".validate": "root.child('Users').child(auth.uid).child('verified').val() === true"

1 个答案:

答案 0 :(得分:0)

正如道格所说,这可以通过以下方式实现:

  • 要求用户每次写帖子时,他们还要向已知位置写一个时间戳(例如/Users/$uid/last_post_timestamp)。
  • 验证他们只能将ServerValue.TIMESTAMP写入该位置。
  • 验证他们只能在/Users/$uid/last_post_timestamp中的当前值至少一天前写一篇新文章。

因此,在新帖子的规则中,您需要遵循以下原则:

(newData.parent().child('Users').child(auth.uid).child('last_post_timestamp').val()
   === now) && 
(newData.parent().child('Users').child(auth.uid).child('last_post_timestamp').val()
   > root.child('Users').child(auth.uid).child('last_post_timestamp').val() + 24*60*60*1000)