代码之家  ›  专栏  ›  技术社区  ›  atlanteh Kyo Kurosagi

#AskFirebase Firestore-防止在没有特定查询的情况下获取整个集合

  •  0
  • atlanteh Kyo Kurosagi  · 技术社区  · 7 年前

    我有一群学生。每个学生都有一个名字和classId。 我的要求是:

    • 可以 获取学生数据并查看他在哪个班级(获取方式
    • 可以 获取一个类的所有学生(按classId查询)。
    • 不能 列出不带classId筛选器的学生集合。
    • “管理员”可以列出整个学生集合,并按名称\ classId筛选学生

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   atlanteh Kyo Kurosagi    6 年前

    显然,指南没有对此进行详细说明,但在 request.query 参考信息:

    // 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) . 这解决了我的问题,但这是一个丑陋的解决方案。如果有人有更好的解决方案,我很乐意听到。