我正在尝试在Firebase实时数据库中实现基于用户的安全性。
作为一个基本示例,我希望经过身份验证的用户能够从“用户”节点读取/写入自己的数据。
我已经在Realtime DB规则模拟器中对此进行了测试,但读取以下参数失败:
Location: /users
Authenticated: true
Provider: Anonymous
UID: "aLoBLejDJ5P4PDZkZhe2LTxO8x32" (tried with and without quotation marks)
我收到了“模拟读被拒绝”的信息(尽管没有解释为什么)。 当我尝试读取REST HTTP GET请求(“错误:权限被拒绝”)时,也会发生同样的情况。
这是我的数据库结构:
{
"users" : {
"-LrAxMc5SANNe-p1Fd6n" : {
"test" : "lol",
"uid" : "aLoBLejDJ5P4PDZkZhe2LTxO8x32"
}
}
}
这是到目前为止的规则
{
"rules": {
"users" : {
".indexOn": "date",
"$uid": {
".read" : "$uid === auth.uid",
".write" : "$uid === auth.uid",
}
}
}
}
预期结果是在HTTP响应中获取该用户的数据,相反,我遇到了以上权限错误。
对于Firebase来说还很陌生,如果我理解/实现规则语法错误或其他原因,我不知道问题是什么。
我从注册中收到的HTTP响应中所接收到的uid(与上面在Firebase文档中看到的示例uid相比)也有很大不同,不知道这是否是问题的一部分?
我的应用程序中唯一的登录方法是当前的电子邮件地址和密码。
答案 0 :(得分:0)
从您表达问题的方式来看,您似乎认为安全规则会自动过滤数据。事实并非如此:安全规则仅确保用户有权读取他们尝试读取的数据。当您附加侦听器时,就会发生这种情况,而这完全不是基于数据库中的实际数据。
有关此内容的更多信息,请参阅文档中的rules are not filters部分,先前的questions on the topic中的一些内容以及securely querying中的文档。
您正在尝试阅读/users
。由于在我们的规则中没有人对该节点具有读取权限,因此数据库将拒绝读取操作。
要使用当前规则读取当前用户的数据,请从指向该用户数据的整个路径中进行读取:
/users/aLoBLejDJ5P4PDZkZhe2LTxO8x32
要允许从/users
节点进行读取,您可以将规则修改为:
{
"rules": {
"users" : {
".indexOn": "date",
".read": "auth.uid != null",
"$uid": {
".write" : "$uid === auth.uid",
}
}
}
}
但这将允许任何人读取所有用户数据。