安全规则通过auth.id获取数据的问题

时间:2013-06-20 17:59:02

标签: firebase firebase-security

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

数据层次结构如下:

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

2 个答案:

答案 0 :(得分:5)

要记住的一件事是安全规则是类型安全的。特别是,在规则中,“6”!= 6(因为一个是字符串,一个是数字)。所以也许你的auth.id是“6”(作为一个字符串),但你的userId是6作为数字?

如果是这种情况,一个可能的修复方法是将您的规则表达式更改为:

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

将强制userId成为字符串。或者,您可以更改数据以确保userId始终存储为字符串。

答案 1 :(得分:0)

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

假设您尝试一次阅读一篇帖子并假设您的身份验证设置正确,那么您的规则应该可以正常运行。

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

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

最重要的一件事是通过进入Forge并使用“模拟器”来测试您的安全规则。您可以以任何用户身份登录,然后尝试读/写,并确切了解哪些安全规则失败以及原因。