当前位置: 首页 > 知识库问答 >
问题:

来自特定文档Firestore安全性的通配符子集合

施英哲
2023-03-14

在我的Firestore中,我使用子集合中的子集合来形成一个大型的“树状”数据结构。每个用户都是这棵树中的一个点,不管他是树根(起点)、树叶(末端的某个地方),还是中间的某个地方。

match /users/{userDocument=**} {
        allow read, write: if resource.data.userid == request.auth.uid;
        // Not actual code but something like this where now under my user document, i can read all other users under me in tree
        if resource.data.userid == request.auth.uid {
                match /{furtherDepthUserDocuments=**} {
                        allow read: if true;
                }
        }
}

编辑:示例。)一个这样的示例可以是具有以下内容的类似学校的系统:

teachers/
         {teachDocid1}/
                       undergrads/
                                {undergradDocid1}/
                                                  phdAssignments/
                                                                 {docid}..
                       tutors/
                                {tutorsDocid1}/
                                                 tutorAssignments/
                                                                 {docid}..
         {teachDocid2}/
                       graduates/
                                {graduatesDocid1}/
                                                 classHomeworks/
                                                                 {docid}..
         {teachDocid3}/
                       preschoolers/
                                 {preschoolersDocid1}/
                                                 studentProjects/
                                                                 {docid}.     

如果这看起来过于复杂,我很抱歉,但是如果教师登录(例如,如果该教师对应于{teachDocid1}),他们将能够查看他们的undergesphdassignmentstutorstutorassignments。现在,如果根{teachDocid1}下的本科生登录,他们将只能查看phdassignments

此树中的每个文档都有一个userid字段,该字段也引用了此文档关联的用户。我可以很容易地找到相应的文档/路径与一个usersid,但有没有任何递归的方法,然后允许读取在安全性下的所有指定的文档?

另外,在node.js中是否有查询这些文档的特定方法?

共有1个答案

有骏奇
2023-03-14

使用uid作为文档id和筛选器构造集合结构,请尝试以下操作,例如:

match /users/{userDocument=**} {
  allow read, write: if resource.data.userid == request.auth.uid;
  match /uid/{document=**} {
    allow read: if request.auth.uid == uid;
  }
}

这是未经测试的

 类似资料:
  • 在我的集合的SnapshotListener中,我使用以下命令循环遍历文档: 在 for 循环中的每个文档中,让我们称之为 ,我在 Cloud Firestore 上还有另一个文档集合。我想检索内子集合中的所有文档(每个文档只有一个字符串字段)。我能够做一个来获取本身,我用它来获取字符串字段,但我不知道如何获取其子集合中的文档。

  • 假设我有一个集合,其中包含子集合。餐厅权限设置在餐厅文档中,如下所示: 餐馆 任何有权访问餐厅的人也可以访问它的任何子集合,包括子集合。这是安全规则: 安全规则 查询餐厅列表可以这样完成,而且效果很好: 查询餐厅 现在如何查询子集合?我知道Firestore需要根据查询推断权限,而不查看底层数据。从逻辑上讲,这应该是可能的,因为任何可以访问的人也可以访问子集合。但是我如何组合这个子集合查询,以便F

  • 为了查询子集合和父文档,我对firest的文档及其最佳实践有一些问题。我试图使用Typecript在我的Firebase函数中进行查询。 DB: ├── 用户(集合) │ └── 用户(ID为的文档) │ │ └── 计划(子集合) 我有一个数组中的用户ID列表,我需要从用户文档和当前文档的子集合计划中收集信息。 但是如何从用户文档和子集合(计划)文档(当前)中获取数据,我不知道在场景中最有效的查

  • 我有文档,其中包含子集合。现在,我想获取子集合中至少有一项的所有项目。这可能吗? 类似于: < code>getDocs(collection(getDB()," Projects)),其中(" Items.size ","

  • 我的FiRecovery数据库中有一个名为Reports的集合,我已经在其中添加了文档。但我现在的问题是我想在报表中添加一个带有子集合的文档,有什么想法吗?

  • Firestore如果我读取了一个集合,该集合包含100个文档,那么firebase是将其计算为100个读取操作还是1个读取操作? 如果我的1个文档包含另外2个集合,每个子集合包含10个文档,那么在这种情况下,总读取计数是多少?如果它单独计算子集合和it文档,那么Firestore的定价非常高