【问题标题】:#AskFirebase Firestore - Prevent fetching entire collection without specific query#AskFirebase Firestore - 防止在没有特定查询的情况下获取整个集合
【发布时间】:2018-02-19 19:56:15
【问题描述】:

我有一群学生。每个学生都有一个姓名和班级 ID。 我的要求是:

  • 可以获取学生数据并查看他在哪个班级(获取方式为 id)。
  • 可以获取一个班级的所有学生(按 classId 查询)。
  • 无法列出没有 classId 过滤器的学生集合。
  • “经理”可以列出整个学生集合并按名称\classId 过滤学生

这可以使用安全规则来实现吗?

【问题讨论】:

  • 什么是 id ?班级号?你将如何区分经理?
  • 但无论如何!你可以通过制定规则来实现这一切:)
  • 是的。你可以做到这一点
  • id 是 studentId。你们可以展示一个样品吗?我阅读了规则部分,但找不到仅基于文档数据的查询本身使规则失败的方法。我以为是request.resource,但这似乎只是为了写作。
  • @rijin & Jason,如果你们知道的话。你能解释一下吗?

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


【解决方案1】:

显然指南没有详细说明这一点,但在request.query reference 中确实如此:

// Allow a query if the user is requesting less than or equal to 10 items
allow list: if request.query.limit <= 10;

// Allow a query starting at the 10th item
allow list: if request.query.offset == 10;

// Allow a query if it's grouped by user (e.g. user anonyous queries)
allow list: if request.query.groupBy['user'] == true;

// Only allow ascending queries on timestamps
allow list: if request.query.orderBy['timestamp'] == 'ASC';

编辑

所以上面的内容对我不起作用,我联系了谷歌,他们说不支持查询功能,他们需要从文档中删除它。

再次编辑
所以我终于想出了一个让我现在满意的解决方案。这不是完美的想法,但它解决了问题。
我在没有 classId 的集合中添加了一个“虚拟学生”,并添加了如下规则:

match /students/{studentId} {
  allow get;
  allow list: if resource.data.keys().hasAny(['classId']);
}

现在上面的所有规则都满足了,但是又产生了一个新问题。当经理试图查询整个集合时,他可能会遇到这个假学生。
我找不到解决这个问题的好方法,所以我必须做的是,除了虚拟学生之外的所有学生也添加一个虚拟字段({a:true}),当经理查询数据时,我还添加一个 where 子句where('a', '==', true)。这解决了我的问题,但它是一种丑陋的解决方案。如果有人有更好的解决方案,我很乐意听到。

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多