我有以下Firebase规则,在使验证按预期工作时遇到问题:
{
"rules": {
".read": true,
".write": true,
"specialItems": {
"$itemid": {
".validate": "root.child('items/' + $itemid).exists()"
}
}
}
}
my.validate规则的目的是,只有在“items”列表中已经存在的条目时,才会接受它。不幸的是Firebase允许我添加到specialItems中,这是毫无疑问的,因为我误解了验证应该如何工作。
我使用appenginepythonurlphetchapi通过REST与firebase对话,并使用PATCH方法。
^{pr2}$当从一个空数据库开始时,这会给我留下一个完整的数据树,它看起来像:
specialItems
-- myItem: "ok"
我原以为这棵树不符合验证规则。我也尝试过使用PUT,它有相同的效果:
url = "https://<my-app>.firebaseio.com/specialItems/myItem.json?auth=" + token
result = urlfetch.fetch(url=url, payload='"ok"', method=urlfetch.PUT)
另一件要注意的事是,我当前需要使用“admin:True”进行身份验证才能写入任何内容,尽管我的规则似乎表明任何人都应该具有读/写权限。这让我想知道我的规则是否被应用了-如果是这样,那么我不确定如何启用我的规则-它们就在“安全和规则”窗格中。我还假设admin不允许违反模式验证规则。
请尝试以下代码
您可以使用仪表板上的模拟器来测试规则。如果不需要身份验证,请确保已选中“启用匿名用户身份验证”,请进行身份验证,然后输入url并检查读写结果。在
你的假设不正确。使用
admin: true
进行身份验证将绕过安全规则。因此,您的.validate规则将不会在这种情况下应用。.validate
规则本身没有任何物理错误。在另外,假设您的问题准确地反映了实际情况,这里不需要身份验证。根路径上的
.write
/.read
true将允许访问Firebase中的任何数据。很有可能,您的规则运行得很好,并且阻止了写入,这就是为什么您错误地认为需要admin: true
来写入数据。在请按照赛义德在回答中的建议,检查模拟器。在
相关问题 更多 >
编程相关推荐