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

Posted

技术标签:

【中文标题】来自特定文档 Firestore 安全性的通配符子集合【英文标题】:Wildcard Subcollections From Specific Document Firestore Security 【发布时间】:2020-11-13 22:07:21 【问题描述】:

在我的 Firestore 中,我正在使用子集合中的子集合来形成一个大型的“树状”数据结构。每个用户都将是这棵树中的一个点,无论他是根(起点)、叶(终点某处)还是中间某处。

整个树大约有 20 层深,我只是使用递归从前端获取所有数据。我遇到的问题是获取特定用户下的所有信息,而无法读取上述关于 Firestore 安全规则的任何用户。例如,root 用户(在开始时)除了他自己之外没有任何人能够读取该文档,而叶用户(在结束时)拥有 EVERYBODY 能够读取该用户文档。

我是否可以在我的 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),他们将能够查看他们的 undegradsphdAssignmentstutorstutorAssignments。现在如果root teachDocid1 下的本科生登录,他们将只能查看phdAssignments

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

还有在 Node.js 中查询这些文档的特定方法吗?

【问题讨论】:

我不太清楚您要做什么。如果您显示示例数据以及针对该数据的特定查询,这些查询应该通过或不通过您想要的规则,这可能会有所帮助。 请举例说明您的做法。由于安全规则不是过滤数据的最佳方式,我们需要更多详细信息和信息,了解您的尝试方式和预期,以便更好地为您提供帮助。 我添加了示例,对于之前没有添加示例,我深表歉意。但是你可以看到每个用户会有不同的未定义深度,然后他们应该能够读取该深度下的所有用户。 【参考方案1】:

使用 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;
  

这是未经测试

【讨论】:

我相信你只能添加一个 glob。我收到此错误Invalid glob match expression. Only one glob match is permitted in a match declaration path.

以上是关于来自特定文档 Firestore 安全性的通配符子集合的主要内容,如果未能解决你的问题,请参考以下文章

每个文档颤动的 Firebase-firestore 安全规则

如何从Swift中的Cloud FireStore Firebase访问特定字段

如何检查传入号码数据是否大于或小于Firestore安全规则中的特定限制?

文档字段的 Firestore 规则

使用 Swift (Firestore) 访问特定文档字段

Firestore - 从文档中获取特定字段