Firebase 应用程序中受保护内容的正确授权规则是否存在最佳实践方法
- 专门使用firepad
- 受保护的内容是指用户创建文档并仅与某些其他用户共享的位置)。
- 此外,我需要能够查询我有权访问的所有文档的 firebase(我创建的文档和其他用户与我共享的文档)
到目前为止我的一些研究:
方法一:秘密网址
我需要知道 URL 才能查看/编辑文档
不是真正的授权,因为任何有权访问该 URL 的登录用户都可以编辑/修改它。
无法索引我有权访问的所有文档
方法2:使用firebase授权规则将用户添加到文档中,并在读/写之前检查用户是否为document.users。
{
"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 数组的冗余用户存储。此用户存储仅用于查询用户有权访问的所有文档。IE:
{
"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.
}
}
}
}
优点:
- 适当的身份验证/授权
缺点:
- 重复数据,必须处理两个数据存储之间的同步问题。这似乎不是一个好主意。
方法 4:组
我们为数据存储中的每个文档都有一个组
无法轻松查询用户可以访问的所有文档的 firebase
有一个更好的方法吗?