基于子集合的 Firestore 规则

时间:2021-01-21 08:10:23

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

我有这样的文档结构:

Courses/[courseId] {
  name: string,
  description: string

  // this is a subcollection
  members/{userId} {
    user: [userId],
    role: 'trainer',
  }
}

现在我想只允许课程的成员读取课程数据。我正在编写这样的规则:

match /databases/{database}/documents {
  match /courses/{course} {
    allow read: if exists(/databases/$(database)/documents/courses/$(course)/members/$(request.auth.uid));

    match /members/{member} {
      allow read, write: if resource.data.userId == request.auth.uid;
      allow create;
    }
  }

}

它不起作用,给我一个错误:Null value error. for 'list'

更新:错误来自这一行:

exists(/databases/$(database)/documents/courses/$(course)/members/$(request.auth.uid)

特别是$(course)。如果我用实际的课程 ID 替换 $(course),错误就会消失。但我需要它是动态的。

我应该改变数据的结构吗?如果是这样,推荐的结构方式是什么?

以前,我有一个包含 memberscourseId 的根集合 userId,就像一个 n-n 关系表。但是,由于 Firestore 规则没有 query 函数,因此我无法根据根 members 集合控制课程的访问权限。

0 个答案:

没有答案