Firestore安全规则不允许两个uid访问文档

时间:2020-09-16 14:31:31

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

TLDR;我想将读取Firestore文档限制为该文档中提到的两个用户。 Firestore安全规则允许一个用户访问,但其他用户则无法访问。


在我的电子商务应用中,当客户A在商店B中下订单时,订单文档将添加到orders集合中。我想设置安全规则,以便该订单只能由客户A或商店B读取。

这是规则的样子:

match /orders/{orderId} {
  allow read:   if request.auth.uid == resource.data.cust.uid ||
                   request.auth.uid == resource.data.shop.ownerUid;
  allow write:  if < Some Condition >;
}

现在,在为客户获取订单时,我正在像这样查询,并且工作正常。安全规则将其通过。

let query = dbFirestore.collection('orders')
    .where("cust.uid", "==", firebase.auth().currentUser.uid)
    .orderBy('statusHistory.New', 'desc')
    .startAfter(lastVisible)
    .limit(5);

query.get();

但是,当我查询商店时(如下所示),我会收到权限被拒绝的错误(根据安全规则)

let query = dbFirestore.collection('orders')
    .where("shop.ownerUid", "==", firebase.auth().currentUser.uid)
    .orderBy('statusHistory.New', 'desc')
    .startAfter(lastVisible)
    .limit(5);

query.get();

两个查询都是相似的,但是一个通过了,另一个失败了!!!

我要提到的另一个事实是客户也可以拥有商店,因此以下是一种可能的情况:
request.auth.uid = shop.ownerUid = cust.uid = firebase.auth().currentUser.uid

我感觉这可能与“规则”错误有关,但我没有任何结论。


我还尝试在查询和规则中添加shopId,但仍然失败。

let query = dbFirestore.collection('orders')
    .where("shop.ownerUid", "==", firebase.auth().currentUser.uid)
    .where("shop.shopId", "==", shopId_of_this_shop)      // <---- This
    .orderBy('statusHistory.New', 'desc')
    .startAfter(lastVisible)
    .limit(5);

规则:

match /orders/{orderId} {
  allow read:   if request.auth.uid == resource.data.cust.uid ||
                   (request.auth.uid == resource.data.shop.ownerUid &&
                    request.resource.data.shop.shopId == resource.data.shop.shopId);
}

作为参考,以下是order文档中的数据:

enter image description here

enter image description here

我对此表示感谢。

1 个答案:

答案 0 :(得分:0)

这是由于索引不存在。

我没有为“ shop.ownerUid”生成索引,并且由于查询失败并显示“ Permission Error”,而不是“ Index is Required”。我一直专注于安全规则。

“ cust.uid”查询已通过,因为它具有索引。

一旦我意识到并生成了“ shop.ownerUid”上的索引和查询的状态字段,它就起作用了。