【发布时间】:2015-08-31 17:12:31
【问题描述】:
我正在使用 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"})
尝试执行此操作时出现“权限被拒绝”错误,尽管我似乎能够read 我在 Forge 中手动创建的书籍。
我还认为存储读者的最佳方式是使其成为图书的属性(一组$uid 供已登录的读者使用)。 ".write" 好像会阻止这个,那我该怎么做呢?
"$uid": {
".write": "auth !== null && auth.uid === $uid",
"readers": {
".write": "auth !== null"
}
},
似乎验证规则在这里也很合适......类似于newData.val() == auth.uid,但我不确定如何验证readers 应该是一个数组(或特别是一组)这些值。
【问题讨论】:
-
据我所知,您的
.read规则是正确的,因为您的ref是/book节点。但我不明白您希望.write如何发挥作用。注意$add生成一个所谓的push-id,和$uid不一样。看起来您更有可能拥有/book/$bookid并且在其下,例如creator具有创建者的uid。然后您可以将book/$bookid/.write设置为auth != null && (!data.exists() || auth.uid == data.child('creator').val())。 -
@FrankvanPuffelen 是
"$bookid"与"$uid"不同吗?我应该创建一个像"book/$bookid"这样的规则还是嵌套"book"和"$bookid"/"$uid"规则(或者没关系) -
任何以
$开头的都只是一个变量,它可以有任何名称。但$uid通常用于“user id”节点,因此由auth.uid标识的节点。由于您是通过$add添加图书,因此它们由 push-id 标识。 -
好问题顺便说一句。很抱歉试图解决在 cmets 中。现在完整答案如下。
标签: firebase angularfire firebase-security firebase-authentication