复杂的Firebase安全规则

时间:2019-06-06 09:45:01

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

我在firebase数据库中有一个名为“ Discussions”的表,它显示了用户创建的一些帖子。

我想在数据库级别创建一个规则,因此如果删除了用户帐户,它将不会显示帖子。

一个示例节点如下所示:

"Discussions" : {
"36" : {
  "-Ldjrrzfo5K94KT2tjBM" : {
    "content" : "text",
    "from" : "lOkhKOJBNEZuvXt2Zgzz5tUr4ft2",
    "time" : 1556655079442
  }

我为此尝试了以下规则:

"Discussions" : {
  "$lan_id": {
".write": "auth != null",
      "$node_id" : {
        ".read": "root.child('Users').child(root.child('Discussions').child($lan_id).child($node_id).child('from').val()).child('deleted').val() != true",
        ".validate": "newData.child('time').isNumber() && newData.child('from').isString() && newData.child('content').isString()"
    }
  }
}

这是一个删除用户的示例:

"Users" : {
"lOkhKOJBNEZuvXt2Zgzz5tUr4ft2" : {
  "aboutme" : "AAADEFAULT",
  "birthdate" : "01.01.1970",
  "city" : "Deleted",
  "deleted" : true,
  "image" : "default",
  "name" : "Deleted Account",
  "online" : 0,
  "register_date" : 0,
  "sex" : 1,
  "thumb_image" : "default",
  "whyhere" : "AAADEFAULT"
}

但是那是行不通的,因为如果我将“ read”规则放在“ $ node_id”中,即使我这样直接设置也不会显示任何记录:

"$node_id" : {
    ".read": true
 }

但是我也需要访问“ $ node_id”才能完成我想做的事情。

有什么办法可以创建这样的规则?

1 个答案:

答案 0 :(得分:0)

其中存在一些语法错误。

  1. 要将$lan_id的值传递给child(),应用引号引起来。如果您写child('$lan_id'),则'$lan_id'只是一个字符串。要在路径中传递捕获的$lan_id段的值,您需要child($lan_id)
  2. child(root.child('Discussions')...的那段时间看起来很奇怪。我无法说出它是否正确,因为您显示的JSON不包含规则检查的deleted属性,但这看起来很不正常。

我希望有更接近的结果:

"root.child('Users').child('Discussions').child($lan_id).child($node_id).child('from').child('deleted').val() !== true"

请注意,您还可以使用parent()来遍历树,因此类似的操作也可能起作用:

"data.parent().child('from/deleted').val() !== true"

如果您在规则的$node_id级别拥有此规则,则对parent()的调用将使您达到$lan_id