2016-09-28 24 views
0

问题是关于下面展开的船舶分支。无处不在,只有经过认证的用户才可以在任何地方编写他们的数据。但是,有一个例外。 任何经过认证的用户可能会读取数据的船舶分支。Firebase规则只允许任何已通过身份验证的用户删除旧数据

到目前为止,我没有任何麻烦,但这里是一个特殊的规则:

任何身份验证的用户可以删除任何UID以下的儿童在船舶分公司提供的时间戳为10秒或以上。

我希望任何用户能够拨打:

firebase.database().ref('/ships/gp3tJa3tgThukt39EejqJpZq12L2/granit').remove(); 

uid: gp3tJa3tgThukt39EejqJpZq12L2 

shipid: granit 

而被授予的权利只删除。

为了检查记录的年龄我存储perf阵列中的firebase.database.ServerValue.TIMESTAMP索引0(我在这里使用一个数组,因为该记录是经常更新,我想数据保持在最低限度)

在客户端,程序可以看到记录何时可能已过期,然后才会调用remove。这是为了避免无用的失败调用。

我需要一些帮助来定义正确的规则。在我试图定义这个规则的第二个例子中突出显示了这条线。

{ 
    "ships": { 
     "EnBawzb0CjZVgAKrMZD4HE3k5rW2": { 
      "oasisoftheseas": { 
       "param": { 
        "scale": 0.33075936163570846, 
        "type": "cruise/royalcaribbean/oasisoftheseas" 
       }, 
       "perf": { 
        "0": 1, 
        "1": 1.11014724E7, 
        "2": 1.70473256E7, 
        "3": 115.7, 
        "timeStamp": 1475144447302 
       } 
      } 
     }, 
     "gp3tJa3tgThukt39EejqJpZq12L2": { 
      "granit": { 
       "param": { 
        "scale": 0.12235531736978282, 
        "type": "riverbarge/granit" 
       }, 
       "perf": { 
        "0": 5, 
        "1": 2.05622392E7, 
        "2": 13154087, 
        "3": 285.9, 
        "timeStamp": 1475144450086 
       } 
      } 
     } 
    } 
} 

下面的规则。这是$ shipid的写规则,我有兴趣正确定义。

{ 
    "rules": { 
    "anchors": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid" 
     } 
    }, 
    "completed": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid == $uid" 
     } 
    },  
    "ships": { 
     ".read": "auth !== null", 
     "$uid":{ 
     ".write": "auth.uid === $uid", 
     "$shipid":{ 
      ".write": "((auth !== null) && 
         (now - data.child('perf').child('timeStamp').val() >= 10000))" 
     } 
     } 
    }, 
    "shipslog": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid" 
     } 
    }  
    } 
} 
+0

你已经在你的问题中包含了JSON树的图片。请用实际的JSON替换为文本,您可以通过点击Firebase数据库控制台中的导出按钮轻松获取。将JSON作为文本可以搜索,使我们能够轻松使用它来测试您的实际数据,并将其用于我们的答案中,并且通常只是一件好事。规则相同。 –

+0

嗨,弗兰克。我用JSON数据替换了图像。我更新了规则,我想我现在已经开始工作了。不过,我真的很感激你的反馈。我想,因为没有中间层,这种事情总是在发生。顺便说一句,我绝对喜欢firebase。刚开始使用它,并花费大部分时间学习。 –

+1

嘿保罗。我将你的规则复制到一个测试数据库中,模拟器允许删除操作(我通过在'/ ships/gp3tJa3tgThukt39EejqJpZq12L2/granit'中写'null'来模拟)。这不是你想要的吗? –

回答

1

好吧,我想到了弗兰克的确认。在问题中编辑的解决方案是正确,安全和可行的。

"ships": { 
     ".read": "auth !== null", 
     "$uid":{ 
     ".write": "auth.uid === $uid", 
     "$shipid":{ 
      ".write": "((auth !== null) && 
         (now - data.child('perf').child('timeStamp').val() >= 10000))" 
     } 
     } 
    },... 

任何数据都可以由记录的所有者写入船舶分公司。在更深层次上,我使用uid通配符和shipid通配符来获取可能过期并需要删除的数据。

时间戳是安全的,因为它是由服务器端的服务器提供的。只有任何已通过身份验证的用户才能删除船只,并提供现在和时间戳之间的差值大于10000毫秒。

这可能是一种非常干净的通用方式,可让客户端应用程序在不需要服务器业务逻辑的情况下清理旧数据。

相关问题