Firestore 安全规则:request.query.limit 不适用于复合查询

时间:2021-01-08 09:10:30

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

 allow list: if request.query.limit <= 15;

当与复合查询一起使用时,此规则会被忽略。

firestore().collection('orders').where('customerId', '==', uid)
      .where('orderStatusCode', 'in', [1, 2, 3])
      .limit(100)
      .get()....

安全规则:

  match /orders/{order} {
  allow list: if request.query.limit <= 15;

  allow read: if request.auth.uid == resource.data.customerId;
  allow create: if request.auth != null;
  allow update: if request.auth.uid == resource.data.customerId;
  allow delete: if false;
}

1 个答案:

答案 0 :(得分:1)

如果任何安全规则允许操作,Firestore 安全规则将允许操作。

在您的情况下,您在列表规则之后的行中允许 read 访问。 readgetlist 的组合。 get 用于文档特定查询,而 list 用于对集合进行查询。即使 list 规则被拒绝,read 规则仍在通过,因此您的查询正在获取数据。

您可以像这样更新您的安全规则以使其正常工作:

match /orders/{order} {
  allow list: if request.query.limit <= 15;

  allow get: if request.auth.uid == resource.data.customerId;
  allow create: if request.auth != null;
  allow update: if request.auth.uid == resource.data.customerId;
  allow delete: if false;
}

或者,如果您希望在 auth.uid == customerId 处向用户提供数据,可以是这样:

match /orders/{order} {
  allow list: if request.query.limit <= 15 
  && request.auth.uid == resource.data.customerId;

  allow get: if request.auth.uid == resource.data.customerId;
  allow create: if request.auth != null;
  allow update: if request.auth.uid == resource.data.customerId;
  allow delete: if false;
}