允许用户读取,写入自己的文档Firestore

时间:2020-07-02 15:20:02

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

我正在尝试设置Firestore安全性,以便用户可以读写自己的文档 这是我用来向数据库添加数据的代码

data() {
  return {
    order: {
      price: null,
      amount: null,
      comment: null,
      createdAt: new Date().toString().slice(0, 25),
      uid: fb.auth().currentUser.uid
    }
  }
}

sendBuy() {
  db.collection("orders").add(this.order);
}

这是读取数据的代码

readData() {
  let uid = fb.auth().currentUser.uid;
  db.collection("orders")
    .where("uid", "==", uid)
    .get()
    .then(querySnapShot => {
      querySnapShot.forEach(doc => {
        console.log(doc.id, "=>", doc.data());
      });
    });
}

我尝试过的Firestore规则不起作用

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /orders/{uid} {
      allow read, write: if request.resource.data.uid == request.auth.uid;
    }
  }
}

请问我该如何实现

2 个答案:

答案 0 :(得分:1)

对于读取操作/查询,您需要检查resource.data.uid而不是request.resource.data.uid。所以:

allow read: if resource.data.uid == request.auth.uid;

这也许也可以用于写操作,但是我还没有测试过。

答案 1 :(得分:1)

这些规则应该起作用:

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

要修复写入中的安全漏洞,您可以执行以下操作(请保持相同):

allow create: if request.resource.data.uid == request.auth.uid
allow update, delete: if resource.data.uid == request.auth.uid && request.resource.data.uid == resource.data.uid

这允许任何登录的人创建属于他们的订单。它仅允许用户在匹配其uid的情况下更新订单,并且不允许他们更改uid。