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
文档中的数据:
我对此表示感谢。
答案 0 :(得分:0)
这是由于索引不存在。
我没有为“ shop.ownerUid”生成索引,并且由于查询失败并显示“ Permission Error”,而不是“ Index is Required”。我一直专注于安全规则。
“ cust.uid”查询已通过,因为它具有索引。
一旦我意识到并生成了“ shop.ownerUid”上的索引和查询的状态字段,它就起作用了。