以下是Firebase中的数据结构:
{
"wall" : {
"-cxwcxwcxw" : {
"name" : "hello",
"status" : 0
},
"-cxwfdscxw" : {
"name" : "stack",
"status" : 0
},
"-cxfdsqcxw" : {
"name" : "overflow",
"status" : 1
}
}
}
我想只允许在列表范围内读取状态为0的wall的项目。我的意思是获取wall的项目列表,其中status为0;
所以我的规则是:
{
"wall": {
"$wall_item_id": {
".read": "data.child('status').val() === 0"
}
}
}
出了什么问题?
编辑:
我已经使用模拟器检查了,我无法访问列表,但我可以访问项目本身(其中status == 0)
答案 0 :(得分:3)
您的规则是正确的,但仅针对单个项目。
允许此读取:https://<my-firebase-app>/wall/-cxwcxwcxw
此读取被拒绝:https://<my-firebase-app>/wall/-cxfdsqcxw
但Firebase数据库不会过滤掉无法访问的项目。如果用户无法读取列表中的一个项目,则无法读取整个列表。
解决这个问题的方法是将无法访问的项目(status === 1
)移动到它自己的位置。
{
"validWall": {
"-cxwcxwcxw" : {
"name" : "hello",
"status" : 0
},
"-cxwfdscxw" : {
"name" : "stack",
"status" : 0
},
},
"invalidWall": {
"-cxfdsqcxw" : {
"name" : "overflow",
"status" : 1
}
}
}