gpt4 book ai didi

firebase - 了解 Firebase 的用户写入、全局读取规则

转载 作者:行者123 更新时间:2023-12-03 22:23:18 25 4
gpt4 key购买 nike

我正在使用 AngularJS 构建一个简单的 Firebase 应用程序。此应用通过 Google 对用户进行身份验证。每个用户都有一个书籍列表。任何人都可以查看书籍,即使它们没有经过身份验证。只有书籍的创建者可以编辑它。但是,个人用户需要能够记录他们已经阅读过一本书,即使是其他人添加的。

我有 rules.json 像这样:

{
"rules": {
".read": false,
".write": false,
"book": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
}
".read": true,
}
}
}

我正在尝试简单地写一本书:

$firebaseArray(new Firebase(URL + "/book")).$add({foo: "bar"})

尝试执行此操作时出现“权限被拒绝”错误,尽管我似乎能够阅读我在 Forge 中手动创建的书籍。

我还认为存储读者的最佳方式是使其成为图书的属性(一组 $uid 供已登录的读者使用)。 ".write" 似乎会阻止这个,那我该怎么做呢?

"$uid": {
".write": "auth !== null && auth.uid === $uid",
"readers": {
".write": "auth !== null"
}
},

这里似乎也适合使用验证规则...类似于 newData.val() == auth.uid,但我不确定如何验证该 readers 应该是这些值的数组(或特别是一组)。

最佳答案

让我们从一个示例 JSON 片段开始:

  "book": {
"-JRHTHaIs-jNPLXOQivY": { //this is the generated unique id
"title": "Structuring Data",
"url": "https://www.firebase.com/docs/web/guide/structuring-data.html",
"creator": "twiter:4916627"

},
"-JRHTHaKuITFIhnj02kE": {
"title": "Securing Your Data",
"url": "https://www.firebase.com/docs/security/guide/securing-data.html",
"creator": "twiter:209103"
}
}

所以这是一个包含两个文章链接的列表。每个链接都是由不同的用户添加的,该用户由 creator 标识。 creator 的值是 uid,这是 Firebase 身份验证提供的值,可在 auth.uid 下的安全规则中使用。

我将在这里将您的规则分为两部分:

{
"rules": {
".read": false,
"book": {
".read": true,
}
}
}

据我所知,您的 .read 规则是正确的,因为您的 ref 是/book 节点。

$firebaseArray(new Firebase(URL + "/book"))

请注意,下面的 ref 不起作用,因为您没有顶级节点的读取权限。

$firebaseArray(new Firebase(URL))

现在是 .write 规则。首先,您需要在 book 级别上授予用户写访问权限。调用 $add 意味着您正在该级别下添加一个节点,因此需要写入访问权限。

{
"rules": {
"book": {
".write": "auth != null"
}
}
}

为了清楚起见,我将 .read 规则留在这里。

这允许任何经过身份验证的用户写入书节点。这意味着他们可以添加新书(您想要的)和更改现有的书(您不想要的)。

您的最后一个要求是最棘手的。任何用户都可以添加一本书。但是一旦有人添加了一本书,只有那个人可以修改它。在 Firebase 的安全规则中,您可以这样建模:

{
"rules": {
"book": {
".write": "auth != null",
"$bookid": {
".write": "!data.exists() || auth.uid == data.child('creator').val()"
}
}
}
}

在最后一条规则中,如果或者此位置没有当前数据(即它是一本新书)或者如果数据是由当前用户创建的,我们允许编写特定书籍。

在上面的例子中,$bookid 只是一个变量名。重要的是,它的规则适用于每一本书。如果需要,我们可以在规则中使用 $bookid,它会分别保存 -JRHTHaIs-jNPLXOQivY-JRHTHaKuITFIhnj02kE。但在这种情况下,不需要这样做。

关于firebase - 了解 Firebase 的用户写入、全局读取规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30858185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com