特定文档Firestore安全中的通配符子集合

时间:2020-07-24 04:28:48

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

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

整棵树大约有20层深,我只使用了递归就可以从前端获取所有数据。我遇到的问题是,要在特定用户下获取所有信息,而又无法读取上述与Firestore安全规则有关的任何用户。例如,根用户(开始时)除了自己能够读取该文档之外还具有NOBODY,而叶用户(结尾时)具有能够读取该用户文档的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。现在,如果根{teachDocid1}下的一个本科生登录,他们将只能查看phdAssignments

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

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

1 个答案:

答案 0 :(得分:0)

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

这是未体验