【问题标题】:Firestore security rules: request.query.limit not working with compound queryFirestore 安全规则:request.query.limit 不适用于复合查询
【发布时间】:2021-01-08 09:10:30
【问题描述】:
 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;
}

【问题讨论】:

  • 你能发布一个忽略规则的示例查询吗?此外,拥有完整的安全规则可能有助于调试此问题。
  • 这里有什么问题?你有limit &lt;= 15,你的查询是limit(10),所以你应该得到数据。您没有获取数据吗?
  • 知道了。谢谢你。我现在就写一个答案。
  • @dshukertjr 即使在查询中将限制设置为 100,我也会获取数据。
  • 我已经更新了答案

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


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 2021-03-25
    • 1970-01-01
    • 2021-03-30
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多