Firebase:阻止除.push之外的所有内容

时间:2016-11-14 13:12:49

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

我已阅读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)"
  },...

1 个答案:

答案 0 :(得分:1)

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

但是你的用例似乎只想拒绝覆盖特定现有注释的write。对于该用例,您应该将.write规则放在树中:

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

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