我有这段代码,但并不知道安全性错误来自何处。我似乎无法弄明白。它可能来自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;
}
我尝试过没有用户信息直接发帖但收到同样的错误。
答案 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;