firebase - 我想检索用户生成的数据,但在 Firebase 中获得权限被拒绝错误
问题描述
为 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 新手,因此我需要一些帮助来了解如何检索我试图访问的数据。
dummyorder id 是:
-LLKkP5GLMkMqy-OvFsY|3wvZGffGY5gUSKlFzhLw7hwXLEi1
数据来自的 UID,3wvZGffGY5gUSKlFzhLw7hwXLEi1
我需要在他的个人资料中显示该数据。
-LLKkP5GLMkMqy-OvFsY
是我也需要向其展示此订单的某些商店。
所以对于 dummyOrder 我给了 id 作为
店铺标识|用户标识
请让我知道我在这里做的错误是什么。我无法理解为什么我会收到权限被拒绝错误以及如何解决它。
谢谢你的帮助。
解决方案
首先要注意的是Firebase 规则不是过滤器。因此,当您尝试从中获取数据时firebase.database().ref('dummyOrders')
,将检查用户是否在该位置具有权限。因为您没有该位置的规则,所以 Firebase 将使用默认值,即false
.
这个问题有两种可能的解决方案。首先是确保您从您在规则中指定的位置读取/写入,在这种情况下firebase.database().ref('dummyOrders').child($dummyid)
。但是由于您使用的是复合键并且您可能只知道用户 ID,我怀疑这是否适合您。
第二个选项是使用基于查询的安全规则。有了它,您可以指定允许的查询。对于问题中的代码,您将获得如下所示的规则。
"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)"
}
}
}
请记住,要使基于查询的规则起作用,查询必须与规则匹配。
推荐阅读
- sql - SQL 在表上查找错误值或跳过错误
- liquibase - 在 liquibase 中插入变更集不起作用
- python - 为什么嵌套函数中只能访问可变变量?
- node.js - 我无法在 pSequel 中提取我的 PG 数据库或将其连接到我的 Node 后端
- amazon-athena - 亚马逊 Athena 可以在没有 Glue 目录的情况下工作吗?
- node.js - 使用 socket.io 通知从用户那里获取输入
- java - 为什么我一次只调用一次 TextViews 中的文本会更改两次?
- android - 我想在 Flutter 上放自己的广告 ID
- javascript - 函数参数和自变量
- r - 使用来自 dplyr 的 Unite 组合多个字符列时出现 na.rm = TRUE 的问题