我尝试让我的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设置多行吗?我需要将它们组合成一行吗?我尝试了所有我能想到的但没有成功。
事先提前答案 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节点可以被所有人写入和读取。任何人都无法访问其他子节点。