尝试验证Firestore用户只能在自己的UID下发布评论时获得权限被拒绝

时间:2018-05-22 16:13:31

标签: angularjs firebase google-cloud-firestore firebase-security

我有这段代码,但并不知道安全性错误来自何处。我似乎无法弄明白。它可能来自cloudfirestore吗?

postComment(getBlogId: string, comment: any): Promise<any> {
    if (this.currentUser) {
      return this.afs.collection('blogs').doc(getBlogId).collection('comments')
        .add({
          author: {
            '_id': this.currentUser.uid,
            'firstname': this.currentUser.displayName ? this.currentUser.displayName : this.currentUser.email
          },
          comment: comment.comment,
          createdAt: firebase.firestore.FieldValue.serverTimestamp(),
          updatedAt: firebase.firestore.FieldValue.serverTimestamp()
        });
    } else {
      return Promise.reject(new Error('LogIn to Continue!'));
    }
  }

这是在服务中,但我在提交评论时收到错误。 在我的组件中,当我提交控制台时,它会给我表格值和博客ID的值。

onSubmit() {
    console.log(this.commentForm.value);
    console.log(this.blog._id);
    this.blogservices.postComment(this.blog._id, this.commentForm.value)
      .then(() => {
        this.blogservices.getComments(this.blog._id)
          .subscribe(comments => this.blog.comments = comments);
      });
  }

我无法将它放在我得到

的地方
  

错误未捕获(在承诺中)FirebaseError [code = permission-denied]:权限丢失或不足FirebaseError:权限丢失或不足。

这是我的firestore规则,我认为这是正确的,因为请求应该匹配用户uid和附加到要提交的数据的资源。

 match /comments/{comment}{
      allow delete: if request.data.user_uid == request.auth.uid;
      allow write: if request.resource.data.user_uid == request.auth.uid;
      allow read;
    }

我尝试过没有用户信息直接发帖但收到同样的错误。

1 个答案:

答案 0 :(得分:0)

您正在将用户发布的{(request.auth.uid)的UID与request.resource.data.user_uid进行比较。这意味着您需要在文档的根目录中包含字段user_uid

然而,在添加文档时,您可以这样做:

.add({
  author: {
    '_id': this.currentUser.uid,
    'firstname': this.currentUser.displayName ? this.currentUser.displayName : this.currentUser.email
  },

因此,当前用户的UID位于author._id,这与您的安全规则所处的路径不同。修复是为了确保两者使用相同的路径。在安全规则中执行此操作将如下所示:

allow write: if request.resource.data.author._id == request.auth.uid;