Google cloud firestore Firestore规则允许任何经过身份验证的用户写入子集合,但只有该子集合的所有者才能读取?

Google cloud firestore Firestore规则允许任何经过身份验证的用户写入子集合,但只有该子集合的所有者才能读取?,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我是Firebase的新手,我正在开发一个firestore应用程序,它的工作原理有点像一个考勤程序。教师和学生都可以使用它,但只有教师才能看到学生的数据。学生必须登录才能拥有uid,当他们“参加”一个课程时,将创建一个以uid为名称的节点,其中的字段包含他们的名称、studentID等。树的形状如下所示,教师当然可以访问他们的所有孩子: teachers/{teacherID}/classes/{classID}/students/{studentID} (我知道这不是很肤浅,但它使基于课堂

我是Firebase的新手,我正在开发一个firestore应用程序,它的工作原理有点像一个考勤程序。教师和学生都可以使用它,但只有教师才能看到学生的数据。学生必须登录才能拥有uid,当他们“参加”一个课程时,将创建一个以uid为名称的节点,其中的字段包含他们的名称、studentID等。树的形状如下所示,教师当然可以访问他们的所有孩子:

teachers/{teacherID}/classes/{classID}/students/{studentID}
(我知道这不是很肤浅,但它使基于课堂的学生获取信息更加简单,查询更少。这是否也需要更改?)

当然,教师也会有诸如姓名、教师ID、电子邮件等信息,学生无法阅读或写入/更新/删除这些信息,但会阅读教室信息,如房间号、时隙等(当然,只有教师可以更新这些信息)。这看起来如何,以便它是安全的,没有滥用?我需要担心规则继承/级联吗

match /teachers/{teacherID} {
      allow read, write: if teacherID == request.auth.uid;
    }

match /teachers/{teacherID}/classes/{classID} {
      allow write: if teacherID == request.auth.uid; //How do I get this value here?
      allow read: if request.auth.uid != null;
    }
match /teachers/{teacherID}/classes/{classID}/students/{studentID} {
      allow read: if teacherID == request.auth.uid; //and here?
      allow write: if request.auth.uid != null;
    }

同样相关:教师和学生角色不存在,因为学生也可以将此出席应用程序用于学生俱乐部/会议,其中俱乐部将是“班级”,而此“学生”将是“教师”。

如果您指定(
=**
),则在安全规则中授予的访问权限仅级联到嵌套集合在
匹配
子句中。因为您在任何地方都不这样做,所以您当前的访问规则不会层叠

在这种情况下,您可能希望在教师的访问规则上放置一个递归通配符,因为您似乎也想让他们访问级联到子集合:

match /teachers/{teacherID=**} {
  allow read, write: if teacherID == request.auth.uid;
}

我试过了,但一直被拒绝。我把它改为:match/teachers/{teacherID}/{docs=**},它又开始工作了。这些语句之间有什么区别?因为
=**
后缀使其成为递归通配符,所以我看到的唯一区别是您的语句捕获了
教师ID
。我不会马上看出这会有什么不同,除非在规则中使用捕获的变量进行测试。