为dummyOrders编写的规则:
"rules": {
"dummyOrders":{
"$dummyid":{
".write": "auth!=null && $dummyid.contains(auth.uid)",
".read": "auth!=null && $dummyid.contains(auth.uid)"
}
}
虚拟订单的结构:
-LLKkP5GLMkMqy-OvFsY|3wvZGffGY5gUSKlFzhLw7hwXLEi1
cemail: "nateshmbhat1@gmail.com"
cid: "NKGiiChIqCdUcithC48mtuWkaAt1"
cname: "Natesh Bhat"
date: "2018-09-01T15:31:25.060Z"
file_names: "JavaEvaluation.doc,"
message: "Sample testing. "
oid: "Order 230"
status: "requested"
xid: "ybfXhEkmCNbOuAN0XJYE8b84ix93"
xshopName: "SIT Campus Xerox"
当我在Firebase中运行模拟器时,它没有给出任何错误。
我正在尝试从dummyOrders和我上面编写的规则中检索数据。
我正在尝试使用以下代码访问数据:
var orderRef = firebase.database().ref('dummyOrders').orderByChild('cid').equalTo(user.uid);
我收到Firebase权限被拒绝的错误。我是Firebase的新手,因此我需要一些帮助来了解如何检索要尝试访问的数据。
虚拟订单ID为:
-LLKkP5GLMkMqy-OvFsY | 3wvZGffGY5gUSKlFzhLw7hwXLEi1
数据来自3wvZGffGY5gUSKlFzhLw7hwXLEi1
的UID,我需要在他的个人资料中显示该数据。
-LLKkP5GLMkMqy-OvFsY
是我也需要向其显示此订单的某些商店的商品。
因此,对于dummyOrder,我将其ID指定为
shopid | userid
请让我知道我在这里犯的错误。我不明白为什么会收到拒绝权限错误以及如何解决该错误。
感谢您的帮助。
答案 0 :(得分:0)
首先要注意的是Firebase rules are not filters。因此,当您尝试从firebase.database().ref('dummyOrders')
获取数据时,它将检查用户是否在该位置具有权限。由于您没有该位置的规则,因此Firebase将使用默认值false
。
有两个可能的解决方案。首先是确保您从规则中指定的位置(在本例中为firebase.database().ref('dummyOrders').child($dummyid)
)中进行读取/写入。但是由于您使用的是复合键,并且您可能只知道用户ID,所以我怀疑这将是适合您的解决方案。
第二个选项是使用Query-based security rules。使用此选项,您可以指定允许的查询。对于问题中的代码,您将获得如下所示的规则。
"rules": {
"dummyOrders":{
".read": "query.orderByChild == 'cid' &&
query.equalTo == auth.uid" // restrict basket access to owner of dummyOrders
"$dummyid":{
".write": "auth!=null && $dummyid.contains(auth.uid)",
".read": "auth!=null && $dummyid.contains(auth.uid)"
}
}
}
请记住,要使基于查询的规则起作用,查询必须与规则匹配。