为什么这个 Firebase 数据库规则被评估为 true,如果它不应该?

Why is this Firebase Database rule being evaluated as true if it's not supposed to?

我正在 Firebase 上测试我的数据的安全性。我最近一直在看文档,我以为我理解了,但是在模拟器上做这样的事情时,我感到头疼:

规则规定:

"propiedades": {
    ".read": "auth != null",
    ".write": "auth != null",
    ".validate": "data.child('owner').val() === auth.token.sub"
}

并且在这种特殊情况下 data.child('owner').val() 也不是 "s0kf6RvEzmfGGjVq9q14GQ6s14H32" 不等于 "s0kf6RvEzmfGGjVq9q14GQ6s14H3"(尾随“2”)也不应该是 auth.token === data.child('owner').val() 但特别是 auth.token.sub 是应该的。这到底是怎么回事?

附带说明一下,即使字符串相等,即使我将规则更改为如下内容,操作也会继续进行:

"propiedades": { 
    ".read": "auth != null",
    ".write": "auth != null",
    "$id" : {
      ".validate": "data.child('owner').val() === auth.token.sub"
    }
}

大量编辑是因为我正在测试所有可能的组合,但一切都违背了我的逻辑。我现在很困惑。

谢谢

您正在检查是否 "propriedades/owner" === auth.token.sub 但是当您写入数据时,您正在写入 "propriedades" 的子节点 "fgdfg" 这意味着您的所有者节点将在 "propriedades/fgdfg/owner"

走在正确的轨道上
"propiedades": { 
    ".read": "auth != null",
    ".write": "auth != null",
    "$id" : {
        ".validate": "data.child('owner').val() === auth.token.sub"
    }
}

除了你应该使用 newData 而不是 datadata 指的是当前存在于数据库中的数据,因为该位置还没有数据(假设)它总是 returns 为真。 newData 将按原样验证数据和新数据,因此这就是您应该使用的。另外,对我来说,auth.token.sub 似乎从来没有用过,所以我用 auth.uid 代替,如果 auth.token.sub 对你有用,你可以保留它。但我会用 [=29= 代替它].

这些是正确的规则:

"propiedades": { 
    ".read": "auth != null",
    ".write": "auth != null",
    "$id" : {
        ".validate": "newData.child('owner').val() === auth.uid"
    }
}