单个属性的Firebase实时数据库规则与同一对象树

时间:2016-12-17 12:36:47

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

我尝试让我的firebase实时数据库规则运行正确,但单个属性规则存在问题。

我的firebase对象看起来像这个例子

"products": {
        "KUg68BknfYWuEjAKla5": {
          "cat": "Pizzas",
          "likes": 132,
          "item_price": 39.9,
          "item_price_single": 39.9,
          "name": "Mussarela",
          "observation": "",
          "product_id": "-KUg68BknfYWuEjAKla5",
          "product_image": "massapan-mussarela.jpg",
          "quantity": 1
        }

我对此对象的规则现在看起来像这样

  "products": {
    ".read": true,
    ".write": "root.child('users').child(auth.uid).child('admin').val() == 'user_is_admin'" 
  ".indexOn": ["status", "categoryId"]
},

所以基本上我允许每个人读取对象,但只有管理员才能写入对象。我的问题是单个属性“喜欢”需要每个经过身份验证的用户可写。我通常会使用“。阅读”:“auth!= null”,,但我不知道如何将它们组合在我的规则中。我可以用.write设置多行吗?我需要将它们组合成一行吗?我尝试了所有我能想到的但没有成功。

事先提前

2 个答案:

答案 0 :(得分:1)

您可以列出喜欢该类别/项目的用户,而不是存储喜欢的数量。像这样:

likes: {
  userid_1: true,
  userid_2: true
}

这样,您可以允许用户仅编辑其路径。就像您通常使用用户列表一样:

".write": "auth.uid === $user"

真正的价值可能是真实的,因为不喜欢内容的用户不会出现在列表中。

您只需要计算列表中的项目数量即可获得喜欢的数量。

不,你不能有多个写规则。相反,使用" .validate"。读取和写入规则级联,因此如果一个为真,则将忽略所有其他规则。验证规则不要级联,它们都必须是真的

答案 1 :(得分:1)

您可以指定对规则中特定子节点的访问权限。例如

products
  product_0
    likes: 123
    item_price: 1.99
  product_1
    likes: 222
    item_price: 4.99

规则只允许读取所有喜欢的节点,但是限制写入管理员会看起来像这样(没有经过测试但是沿着这些线路)

{
  "rules": {
    "products": {
      "$each_product": {
        "likes": {
         ".read": true,
         ".write": "root.child('users').child(auth.uid).child('admin').val() == 'user_is_admin'"
        },
       "item_price": {
         ".read": true,
         ".write": true
       }
      }
    }
  }
}

另一方面,item_price节点可以被所有人写入和读取。任何人都无法访问其他子节点。