Firebase:阻止除 .push 之外的所有列表

Firebase: prevent all but .push to a list

我已经阅读 In firebase, can I set permissions to allow only PUSH operations to a given object? 并且到目前为止复制了它,但是它不起作用。

我有一个匿名使用的网站,也是我收集评论的网站。我想存储要添加的新数据,但要防止编辑和删除现有数据。

Angular 2,用AngularFire2

export class FirebaseService {

  comments: FirebaseListObservable<Object>;
  locations: FirebaseListObservable<Object>;

  constructor(private af: AngularFire) {
      this.comments = this.af.database.list(environment.stem + '/comments');    
  }

  addComment(comment) {
    return this.comments.push(comment)
      .catch(err => console.error(err));
  }
}

我预计这条规则会执行,因为在我推送的情况下不会有现有数据?

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

将写入规则设置为 true 使其工作但比我想要的更宽松。

这是数据库这条路径中现有 json 的开始(这里的键来自我正在迁移的服务)

{
  "0763a8d3e2407697" : {
    "comment" : "Thanks for your comments and feedback, Simon",
    "date" : "Sat Jan 03 2015 08:46:17 GMT+0100 (CET)"
  },...

根据您当前的规则,只要数据库中存在 任何 数据,数据库服务器就会拒绝写入。

但是您的用例似乎只想拒绝覆盖特定现有评论的写入。对于该用例,您应该将 .write 规则放在树的较低位置:

{
  "rules": {
    ".read": true,
    "$stemid": {
      "comments": {
        "$commentid": {
          ".write": "!data.exists() && newData.exists()"
        }
      }
    }
  }
}

这些规则use $ variables确保它们适用于所有词干和所有评论。