【问题标题】:Firebase database rules – `data.exists()` always seems to be true, possible bug?Firebase 数据库规则 – `data.exists()` 似乎总是正确的,可能的错误?
【发布时间】:2017-12-10 05:29:10
【问题描述】:

我正在尝试保护我的 firebase 数据库以允许创建新记录,但不允许删除现有记录。最终,我计划在我的应用程序中使用 Firebase 身份验证,并允许用户更新现有记录(如果他们是作者),但我试图首先让这个简单的案例工作。

但是!无论我在数据库规则模拟器中尝试什么,尽管seems to suggest 的文档是什么,data.exists() 的值似乎总是正确的。根据我对the documentation 的理解,变量data 表示数据库中的一条记录,就像它在操作发生之前所做的那样。也就是说,对于创建,data 将不存在,而对于更新/删除,data 将引用数据库中存在的真实记录。 情况似乎并非如此,以至于我实际上怀疑 Firebase 中存在错误,因为在我的数据库上设置以下规则时,不允许所有写入操作

{
  "rules": {
    ".read": true,
    ".write": "!data.exists()"
  }
}

无论我在模拟器中输入了什么值,无论是位置还是数据。我什至编写了一个小型 EmberJS 应用程序来验证模拟器是否在说真话,并且它也被拒绝所有写操作的权限。

我真的不知道从这里去哪里,因为我几乎没有东西可以尝试。我尝试从我的数据库中删除所有记录,这让模拟器认为它可以执行写操作,但我的测试应用程序仍然得到 PERMISSION_DENIED,所以我不知道是什么导致了那里的不一致。

我对预定义的data 变量的理解是否正确?如果是这样,为什么我不能写我想要的规则?我已经看到snippets 确实试图实现我的“仅创建,不删除”规则,这似乎符合我的理解。

最后一点:我正在一个全新的 Firebase 项目中尝试这个,只使用上面的规则,我的数据库周围只有几条垃圾数据记录。

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    因为您已将!data.exists() 放置在数据库的根位置,所以data 指的是整个数据库。只有当数据库完全为空时,您才能写入数据库。

    您表示您在运行测试时只使用了我的数据库周围的几条垃圾数据记录。这些记录将导致data.exists() 为真。

    您可以通过将!data.exists() 规则放在树中您希望要求不存在数据的特定位置来实现您的目标。这通常在具有通配符键的位置完成,如您链接的示例中所示:

    {
      "rules": {
        // default rules are false if not specified
    
        "posts": {
          ".read": true, // everyone can read all posts
    
          "$postId": {
            // a new post can be created if it does not exist
            // existing posts can only be edited by their original "author"
            ".write": "!data.exists() && newData.exists() || data.child('author').val() == auth.uid",
            ".validate": "newData.hasChildren(['title', 'author', 'timestamp'])",
          }
        }
      }
    }
    

    【讨论】:

    • 您好,感谢您的回复。这是我理解的缺失部分,我显然没有正确解析文档。我实施了这样的更改,现在一切都按预期工作 100%。我假设data 是一种神奇解析的变量,它是根据您提出的请求而不是根据规则本身推断出来的。谢谢!
    • 我已经在我的数据库中尝试过这种方式,但它总是阻止将新数据设置到数据库中。这是我的问题stackoverflow.com/questions/53073292/…
    • 请帮我解决我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2018-02-07
    • 2017-02-10
    相关资源
    最近更新 更多