我是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
子句中指定递归通配符(=**
(,则安全规则中授予的访问权限仅级联到嵌套集合。由于您在任何地方都不会这样做,因此您当前的访问规则不会级联。
在这种情况下,您可能希望在教师的访问规则上放置一个递归通配符,因为您似乎也希望他们的访问级联到子集合:
match /teachers/{teacherID=**} {
allow read, write: if teacherID == request.auth.uid;
}