我在设置安全规则时遇到问题,特别是阅读帖子数据。
数据层次结构如下:
posts : {
0 : {
title: "Post One",
userId: 6
}
},
users : {
6 : {
name: "My Name"
}
}
我的规则是:
{
"rules": {
"posts" : {
"$post": {
".read":"data.child('userId').val() == auth.id",
".write":"newData.child('userId').val() == auth.id"
}
},
"users":{
"$user": {
".read":"auth.id == $user",
".write":"auth.id == $user"
}
}
}
}
我知道“auth.id”是6,因为它正在为我的用户信息正确地提取规则。如果我更改规则以静态提取数字,它可以工作:
"$post": {
".read":"data.child('userId').val() == 6",
".write":"newData.child('userId').val() == auth.id"
}
但使用auth.id却没有。有什么我想念的吗?
答案 0 :(得分:5)
要记住的一件事是安全规则是类型安全的。特别是,在规则中,“6”!= 6(因为一个是字符串,一个是数字)。所以也许你的auth.id是“6”(作为一个字符串),但你的userId是6作为数字?
如果是这种情况,一个可能的修复方法是将您的规则表达式更改为:
data.child('userId').val() + '' == auth.id
将强制userId成为字符串。或者,您可以更改数据以确保userId始终存储为字符串。
答案 1 :(得分:0)
您尚未包含用于查找此数据的代码 - 可能是错误的位置 - 或您收到的错误;那些会有所帮助。
假设您尝试一次阅读一篇帖子并假设您的身份验证设置正确,那么您的规则应该可以正常运行。
快速猜测是您尝试阅读整个“帖子”路径,并使用安全规则来过滤帖子。但安全规则基本上是原子的。如果您尝试阅读“帖子”,并且其中一个帖子有一个阻止阅读的规则,则整个操作将失败。
相反,您需要将帖子分段为经过身份验证的用户可以读取所有数据的路径,然后您可以相应地应用安全规则。
最重要的一件事是通过进入Forge并使用“模拟器”来测试您的安全规则。您可以以任何用户身份登录,然后尝试读/写,并确切了解哪些安全规则失败以及原因。