firebase 中受保护内容的适当授权规则

Posted

技术标签:

【中文标题】firebase 中受保护内容的适当授权规则【英文标题】:Proper authorization rules for protected content in firebase 【发布时间】:2013-07-21 19:37:27 【问题描述】:

对于 Firebase 应用中受保护内容的正确授权规则是否存在最佳实践方法

专门使用firepad 我所说的受保护内容是指用户创建文档并仅与某些其他用户共享的位置)。 此外,我还需要能够在 Firebase 中查询我有权访问的所有文档(我创建的文档和其他用户与我共享的文档)

到目前为止我的一些研究:

方法一:秘密网址

我需要知道 URL 才能查看/编辑文档

不是真正的授权,因为任何有权访问该 URL 的登录用户都可以编辑/修改它。

无法索引我有权访问的所有文档

方法2:使用firebase授权规则将用户添加到文档中,并在读/写之前检查用户是否为document.users。

取自: Protected content in Firebase possible?



"documents": 

   "$documents_id": 

       // any friend can read my post

       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",

       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"

   ,

   users:

   // List of user.ids that have access to this document

   




优点:

正确的授权/身份验证。只有获得访问权限的经过身份验证的用户才能查看/编辑。

缺点:

无法查询允许用户编辑的所有文档(我拥有或与我共享的文档)(这个假设是否正确?)

方法 3: Firebase 授权规则(方法 2),加上每个用户可以访问的具有 document_id 数组的冗余用户存储。此用户存储仅用于查询用户有权访问的所有文档。 即:


"documents": 
   "$documents_id": 
       // any friend can read my post
       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
   
,
"users":
    "$user":
        ".read": "auth.id=$user.id",
        ".write": "auth.id=$user.id"
        "$documents":
            // All the documents i have access to. This list gets ammended whenever I am granted/stripped access to a document.
        
    


优点:

正确的身份验证/授权

缺点:

重复数据,必须处理两个数据存储之间的同步问题。这似乎不是一个好主意。

方法四:分组

按Granting access to Firebase locations to a group of users 使用组

我们为数据存储中的每个文档都有一个组

无法轻松地在 Firebase 中查询用户可以访问的所有文档

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您在列举选项方面做得很好,而且您肯定走在正确的轨道上。正如您所发现的,没有办法根据安全规则进行查询。这是有意完成的,因为(取决于您的安全规则)这可能会非常昂贵(Firebase 通常会因此避免复杂的查询)。

因此,您的方法 3 是执行此操作的正确方法。为这类情况复制数据实际上是一种非常常见的做法。请参阅 Denormalizing Your Data is Normal 了解更详细的博文。

您也可以对重复的文档列表执行方法 1。如果您希望能够仅使用 URL(包含秘密 ID)“邀请”某人访问文档,这将特别有用。或者您可以将两者结合起来(让一些文件“公开但不公开”,而另一些文件“对受邀的朋友保密”或其他。)

【讨论】:

感谢迈克尔的澄清。只需要小心保持每个重要位同步。 是的。尽管在很多情况下,您可以很容易地使您的代码对不匹配具有鲁棒性。例如,如果您的列表中有一个文档,但是当您尝试读取其元数据时收到权限被拒绝错误,则只需将其对用户隐藏即可。这样,安全规则就是真正的权威,您的个人文档列表只是您应该有权访问的“提示”,如果它稍微不同步,也没关系。当然,如果您可以确保它们保持同步,那就更好了,但这并不总是 100% 必要的。 :-)

以上是关于firebase 中受保护内容的适当授权规则的主要内容,如果未能解决你的问题,请参考以下文章

C++17 中受保护构造函数的规则改变了吗?

尝试访问 <img /> 中受保护的视频流时未要求授权 - 标签 = 403 [重复]

如何防止未经授权访问我的 Firebase 实时数据库?

c#中受保护和私有保护有啥区别? [复制]

.Net中受保护的内部意味着啥[重复]

为啥 Java 允许增加子类中受保护方法的可见性?