1

我在正确设置安全规则时遇到问题,特别是阅读帖子数据。

数据层次结构如下:

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 不会。有什么我想念的吗?

4

2 回答 2

5

One thing to keep in mind is that security rules are type-safe. In particular, In the rules, "6" != 6 (since one is a string and one is a number). So perhaps your auth.id is "6" (as a string), but your userId is 6 as a number?

If that's the case, one potential fix would be changing your rule expression to something like:

data.child('userId').val() + '' == auth.id

which will force userId to be a string. Alternatively, you could change your data to make sure userId is always stored as a string.

于 2013-06-20T19:45:38.940 回答
0

您尚未包含用于查找此数据的代码(可能是错误所在的位置)或您收到的错误;这些会有很大帮助。

假设您尝试一次阅读一篇文章,并且假设您的身份验证设置正确,您的规则应该可以正常工作。

一个快速的猜测是您正在尝试阅读整个“帖子”路径,并使用安全规则来过滤您的帖子。但安全规则本质上是原子的。如果您尝试阅读“帖子”,并且其中一个帖子具有阻止阅读的规则,则整个操作将失败。

相反,您需要将帖子分割成经过身份验证的用户可以读取所有数据的路径,然后您可以相应地应用安全规则。

将有很大帮助的一件事是通过进入您的 Forge 并使用“模拟器”来测试您的安全规则。您可以以任何用户身份登录,然后尝试读/写,并准确查看哪些安全规则失败以及原因。

于 2013-06-20T19:05:19.233 回答