Firebase:集合组查询的 Firestore 安全规则

时间:2021-02-26 17:20:50

标签: firebase security rules

这里的第一个问题...温柔点!!

我无法(终其一生!)让我的 collectionGroup 查询与我的安全规则相匹配。

我有一个 web 应用程序,它允许 驱动程序 在驻留的 清单文档 中记录他们的时间和(预设)目的地在名为 /history 的子集合中。 用户可以在任何给定时间通过从所有驱动程序的子文件中检索清单文件来查看驱动程序的进度-仅限今天的收藏。

我的数据是这样的:
/drivers/{driverDoc}/history/{manifestDoc}
ma​​nifestDoc 有一个 summary.shiftDate 字段,该字段也用作文档名称。

我的 (javascript) 代码调用...
db.collectionGroup('history').where('summary.shiftDate', '==', dateOfShift).limit(10);

其中 'summary.shiftDate' 是 manifestDoc 中的映射,而 dateOfShift 是“今天的日期”(YYYY-M-D)的常量

这在测试模式下与 firestore 配合良好(如您所料)

...然后我应用了安全性,这在整体上是有效的。摘自我的安全规则如下:

match /drivers/{driverDoc} {
  allow create: if request.resource.id == request.auth.uid;
  allow read: if isNotNull() && (userExists() || isDriver(driverDoc)) || isClient();
  allow update: if (isUser() || isAdmin() || isDriver(driverDoc));
  allow delete: if isAdmin();

  match /drivers/{anyDriver=**}/history/{manifest} {
    allow list: if documentNameMatchesDateToday()
  }

  match /history/{manifestDoc} {
    allow read: if isNotNull(); // && (isClientUser() || isUser() || isAdmin() || (isDriver(driverDoc) && driverIsOperational(driverDoc)));
    allow update: if isDriver(driverDoc) || (userExists() && isUser());
    allow delete: if isAdmin();
    allow create: if isDriver(driverDoc) || isAdmin();
  }
}   

我已经阅读了 [安全查询数据][1] 和 firebase.firestore.Timestamp 文档,但我无法弄清楚如何编写 documentNameMatchesDateToday() 函数,以便我的查询和安全规则匹配并返回结果,而不是 '权限被拒绝'

我想也许 Timestamp 可能是这样?但我想不出解决办法

帮助/指针/建议(和完整的解决方案)都同样受欢迎!

0 个答案:

没有答案
相关问题