短版
我正在使用防火墙构建一个应用程序,用户可以在其中创建课程,为这些课程添加资源,然后让其他用户注册他们的课程,这将使他们能够访问所有的课程资源。我正在努力建立安全规则,以便只有课程组织者或课程成员才能访问这些资源。我的主要问题是允许用户列出他们注册的课程中的所有资源,因为列表请求不允许安全规则中的查询,我需要检查该用户是否是该课程的成员。什么是最好的方法,让数百(或潜在的数千)当然会员可以很容易地列出所有的课程资源,同时确保它是不可能的非会员访问它?
在文档的限制部分中,它特别提到将角色移动到大型或复杂组的单独集合中,但这样做将需要执行查询的安全规则来检查对列表请求不可能的访问。
全verison
我正在创建一个原型web应用程序,客户端直接访问防火墙。消除后台处理简单数据访问的需要是令人耳目一新的,但我现在真的很难为我的用例找到正确的数据结构和方法,特别是在实现适当的安全规则方面。
我对关系数据库做了大量的工作,但对于nosql数据库和消防站来说,我还是很新的,但这并没有帮助。
概念
我的应用程序中的主要集合是用户、课程和资源。用户可以创建他们创建学习资源的课程,然后其他用户可以注册这些课程,因此可以访问这些课程中的所有资源。由于某些课程只会被邀请,用户不可能为他们不是其成员的课程获取资源。
主要要求是:
My approach
首先,我的方法是大量使用子集合。对于组织者或观点,用户有课程,有资源,所以我以这种方式建模。
用户->课程->资源
组织者的安全规则在这里也很简单,因为用户id是文档路径的一部分,它可以很容易地与可用的用户uid进行检查(谢谢firebase auth)。
i.e
match /users/{userId}/courses/{courseId}/resources/{resourceId} {
allow read, write, update, delete: if (request.auth.uid == userId)
}
但事实证明,给予会员只读访问的难度要大一些。我需要一个合适的地方来存储那个映射。最后,我尝试使用用户的子集合来存储它,因此可以使用:/users/{userId}/course_memberships/{courseId}
查找课程成员。
理论上,我可以编写一条安全规则来授予对如下课程和资源的读访问权:
match /users/{userId}/courses/{courseId}/resources/{resourceId} {
allow read: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/course_memberships/${courseId})
}
但是,只有在检索单个文档时,list请求才能在安全规则中计算查询,因此此设置不允许课程成员查看给定课程中所有资源的列表。
我不知道这里的正确方法是什么,我看到的唯一选择是:
这里是否有更好的方法,或者说消防站不太适合这种类型的问题?
希望这个问题还没有得到回答,我做了一个搜索,找不到同样的场景。
发布于 2019-12-30 13:59:27
https://stackoverflow.com/questions/59529918
复制相似问题