Firebase 安全API身份验证和$variables不相等

Firebase 安全API身份验证和$variables不相等,firebase,Firebase,我为我的应用程序尝试了以下安全规则,但遇到了问题。我的firebase中有一个用户,唯一id为2 { "rules": { "users": { "$user": { ".read": "$user == auth.id", ".write": "$user == auth.id" } } } } 我已经检查过,当我执行“.write”:“$user==2”,我将无法在firebase上写入,但当我执行”.writ

我为我的应用程序尝试了以下安全规则,但遇到了问题。我的firebase中有一个用户,唯一id为2

{
  "rules": {
    "users": {
      "$user": {
        ".read": "$user == auth.id",
        ".write": "$user == auth.id"
      }
    }
  }
}
我已经检查过,当我执行
“.write”:“$user==2”
,我将无法在firebase上写入,但当我执行
”.write:“$user==2”
,我将能够在firebase上写入

另一方面,当我执行
“.write”:“auth.id==2”
时,我将能够在firebase上编写

似乎$user被视为字符串,而auth.id被视为数字。我已经在查阅了文件,但事实证明对这件事毫无帮助

在一次绝望的尝试中,我尝试了
“.write:“$user==auth.id.toString()”
这当然给了我这个错误:“6:29:Type error:对不是函数的目标的函数调用。”

有谁能就这件事给我一些建议吗


我能想到的唯一解决办法是将“userId”作为$user的子对象,它将被读取为一个数值而不是字符串。

有两个不明显的细节可能会让您感到困惑

安全规则总是使用
===

您的
=
被安全规则自动转换为
==
;要了解更多信息,请查看文档的“”部分

记录ID被转换为字符串

您插入的用户ID(2)正在转换为字符串(我在上面找不到文档,但记得读过它)。换句话说,记录ID是
“2”
,而不是
2
,因此身份验证数据中的值需要与之匹配


希望这能有所帮助:)

有两个不明显的细节可能会让你绊倒

安全规则总是使用
===

您的
=
被安全规则自动转换为
==
;要了解更多信息,请查看文档的“”部分

记录ID被转换为字符串

您插入的用户ID(2)正在转换为字符串(我在上面找不到文档,但记得读过它)。换句话说,记录ID是
“2”
,而不是
2
,因此身份验证数据中的值需要与之匹配

希望这有帮助:)

需要解决方法(在另一个答案的评论中提到)才能让我在Firebase模拟器中实现这一点:

$user==''+auth.id

需要解决方法(在另一个答案的评论中提到)才能在Firebase模拟器中为我实现这一点:


$user==''+auth.id

加藤是对的,尽管这实际上是我们这边的一个bug。你的规则应该按原样运作。作为临时解决方法,您可以将规则更改为“$user==”+auth.id”,以将auth.id转换为字符串。但从长远来看,这并不是必须的。正如@MichaelLehenbauer提到的,这是我们这边的一个bug。这个问题现在应该解决了(auth.id被正确地当作字符串处理),但是如果您遇到任何进一步的问题,请联系我们。@MichaelLehenbauer我刚刚又遇到了一个黑客的计划,浪费了半个小时调试它。解决方法很好,但我做错了什么吗?或者它还没有修复。@Joe如果您使用Firebase登录(例如,使用我们的facebook、twitter或电子邮件/密码提供商),那么auth.id应该是一个字符串,这样您就可以与任何$-变量进行比较而不会出现问题。如果您正在执行自己的auth,并且auth.id是一个数字,那么您仍然需要按照Kato在这里描述的方式进行字符串转换。对不起@MichaelLehenbauer感谢您的快速回复。不幸的是,我属于后一组,对现有系统使用定制jwt。我现在以字符串形式传递id,所以我不必进行转换。加藤是对的,尽管这实际上是我们这边的一个bug。你的规则应该按原样运作。作为临时解决方法,您可以将规则更改为“$user==”+auth.id”,以将auth.id转换为字符串。但从长远来看,这并不是必须的。正如@MichaelLehenbauer提到的,这是我们这边的一个bug。这个问题现在应该解决了(auth.id被正确地当作字符串处理),但是如果您遇到任何进一步的问题,请联系我们。@MichaelLehenbauer我刚刚又遇到了一个黑客的计划,浪费了半个小时调试它。解决方法很好,但我做错了什么吗?或者它还没有修复。@Joe如果您使用Firebase登录(例如,使用我们的facebook、twitter或电子邮件/密码提供商),那么auth.id应该是一个字符串,这样您就可以与任何$-变量进行比较而不会出现问题。如果您正在执行自己的auth,并且auth.id是一个数字,那么您仍然需要按照Kato在这里描述的方式进行字符串转换。对不起@MichaelLehenbauer感谢您的快速回复。不幸的是,我属于后一组,对现有系统使用定制jwt。我现在将id作为字符串传递,因此不必进行转换。