我试图让我的数据库安全,我的方案数据如下:
receipts: [
{
userId: id,
...
},
{
userId: id,
...
},
...
]
每张收据都有userId
字段,其中包含有关其创建者的信息。我想返回特定用户的收据清单。为此,我做了一个REST调用,如下所示:
https://[PROJ_NAME].firebaseio.com/receipts.json?orderBy="userId"&equalTo="[USER_ID]"&auth=[TOKEN]
在所有开放的规则上它都很有效。但我想保护我的数据库,以便其他用户只能通过更改URL来查看所有资源。
在firebase文档中,我找到了这样的片段:
"baskets": {
".read": "auth.uid != null &&
query.orderByChild == 'owner' &&
query.equalTo == auth.uid" // restrict basket access to owner of basket
}
这似乎是合理的,所以我将它应用于我的配置,但现在它总是失败。这就是我的文件的样子:
{
"rules": {
"receipts": {
".indexOn": ["userId"],
".read": "auth.uid != null &&
query.orderByChild == 'userId' &&
query.equalTo == auth.uid"
}
}
}
不幸的是,它总是返回"error" : "Permission denied"
。因为那件事,我整天都失去了:(
任何人都可以帮我吗?
答案 0 :(得分:3)
firebaser here
更新(2018-01-25):此错误现已修复。由于这是服务器端问题,因此无需更新SDK。
以下原始答案
服务器解释目前使用query.orderByChild
和query.equalTo
的安全规则的方式存在错误。我们正在努力修复。
要解决此问题,您可以合并query.startAt
和query.endAt
以获得相同的结果:
".read": "auth.uid != null &&
query.orderByChild == 'userId' &&
query.startAt == auth.uid &&
query.endAt == auth.uid"