了解 Firebase 的用户写入、全局读取规则
Understanding Firebase's rules for user-write, global-read
我正在使用 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"})
尝试执行此操作时出现 "permission denied" 错误,尽管我似乎能够 read
我在 Forge 中手动创建的书籍。
我还认为最好的存储读者的方法是将其设为 属性 本书(一组 $uid
用于登录读者)。 ".write"
好像它会阻止这个,那我该怎么做呢?
"$uid": {
".write": "auth !== null && auth.uid === $uid",
"readers": {
".write": "auth !== null"
}
},
似乎验证规则在这里也适用......类似于 newData.val() == auth.uid
,但我不确定如何验证 readers
应该是一个数组(或者特别是一组)这些值。
首先关闭 "permission denied" 错误。您收到此错误是因为您试图直接在 "book" 节点而不是 "book/$uid" 中写入。
您现在所做的示例:
"book": {
"-JRHTHaIs-jNPLXOQivY": { //this is the generated unique id
"foo": "bar"
},
"-JRHTHaKuITFIhnj02kE": {
"foo": "bar"
}
}
在您的规则中,您将写入的全局规则设置为 false,因此这将是默认值,并且在其旁边您为特定节点 book/$uid 制定了规则。因此,当尝试直接写入 "book" 时,它将采用设置为 false 的默认规则。查看 Securing your data 了解有关 firebase 规则的更多信息。
对于你问题的最后一部分,我建议你查看 Structuring data 以了解有关在 firebase 中构建数据的最佳方法的更多信息。
所以请好好看看你想在 firebase 中保存和写入什么以及如何保存,并确保你的规则结构相应。
让我们从示例 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"
}
}
所以这是一个包含两个 link 文章的列表。每个 link 都是由不同的用户添加的,该用户由 creator
标识。 creator
的值是 uid
,它是 Firebase 身份验证提供的值,可在 auth.uid
.
下的安全规则中使用
我将在这里把你的规则分成两部分:
{
"rules": {
".read": false,
"book": {
".read": true,
}
}
}
据我所知,您的 .read
规则是正确的,因为您的 ref 指向 /book 节点。
$firebaseArray(new Firebase(URL + "/book"))
请注意,下面的引用将不起作用,因为您没有对顶级节点的读取权限。
$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
。但在这种情况下,这是不需要的。
我正在使用 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"})
尝试执行此操作时出现 "permission denied" 错误,尽管我似乎能够 read
我在 Forge 中手动创建的书籍。
我还认为最好的存储读者的方法是将其设为 属性 本书(一组 $uid
用于登录读者)。 ".write"
好像它会阻止这个,那我该怎么做呢?
"$uid": {
".write": "auth !== null && auth.uid === $uid",
"readers": {
".write": "auth !== null"
}
},
似乎验证规则在这里也适用......类似于 newData.val() == auth.uid
,但我不确定如何验证 readers
应该是一个数组(或者特别是一组)这些值。
首先关闭 "permission denied" 错误。您收到此错误是因为您试图直接在 "book" 节点而不是 "book/$uid" 中写入。
您现在所做的示例:
"book": {
"-JRHTHaIs-jNPLXOQivY": { //this is the generated unique id
"foo": "bar"
},
"-JRHTHaKuITFIhnj02kE": {
"foo": "bar"
}
}
在您的规则中,您将写入的全局规则设置为 false,因此这将是默认值,并且在其旁边您为特定节点 book/$uid 制定了规则。因此,当尝试直接写入 "book" 时,它将采用设置为 false 的默认规则。查看 Securing your data 了解有关 firebase 规则的更多信息。
对于你问题的最后一部分,我建议你查看 Structuring data 以了解有关在 firebase 中构建数据的最佳方法的更多信息。
所以请好好看看你想在 firebase 中保存和写入什么以及如何保存,并确保你的规则结构相应。
让我们从示例 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"
}
}
所以这是一个包含两个 link 文章的列表。每个 link 都是由不同的用户添加的,该用户由 creator
标识。 creator
的值是 uid
,它是 Firebase 身份验证提供的值,可在 auth.uid
.
我将在这里把你的规则分成两部分:
{
"rules": {
".read": false,
"book": {
".read": true,
}
}
}
据我所知,您的 .read
规则是正确的,因为您的 ref 指向 /book 节点。
$firebaseArray(new Firebase(URL + "/book"))
请注意,下面的引用将不起作用,因为您没有对顶级节点的读取权限。
$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
。但在这种情况下,这是不需要的。