Firebase 中的多个管理员 - 这可能吗?

Multiple admins in Firebase - is it possible?


我正在尝试创建一个仅使用 Firebase 作为数据库服务的客户端应用程序,但我在定义允许多个 'admin' 用户访问某些数据的安全规则时遇到了一些困难。

我的数据模式如下所示:

{
  admins: {
    simpleLogin:1 : true,
    facebook:1234 : true
  },
  myData: {
    simpleLogin:1 : {
      .....
    },
    google:1234 : {
      .....
    },
    facebook:1234 : {
      .....
    }
  }
}

我正在尝试允许登录用户写入其在 'data' 对象中的位置(我正在使用 ref.child('myData').child(auth.uid).set(...) 写入以防止用户访问其他用户数据。此外,其uid 定义在'admins' 数据中的用户应该能够读取/写入所有'myData' 对象。

我的安全JSON是这样定义的:

{
 "rules": {    
   "admins": {      
     ".write": false,
     ".read": true
   },
   "myData": {      
      "$user_id": {
         ".read": "$user_id === auth.uid ||  
              root.child('admins').hasChild(auth.uid)",
         ".write": "$user_id === auth.uid || 
              root.child('admins').hasChild(auth.uid)"
       }
   }
 }

当然这是行不通的,因为 'myData' 没有明确定义 read/write 权限 - 所以当我试图与用户一起阅读 ref.child('myData').once('value', function() {..}) 时,它的 uid'admins' - 我做不到。

我正在尝试 运行 以下查询并获取其 uid 在 'admins 中的用户并获取 permission denied

ref.child('myData').once('value', function(snapshot)     
  {console.log(snapshot.val())}, function() {console.log(arguments)}))

是否有可能做我想做的事?

每个用户都应该能够阅读 admins 节点。

"rules": {    
   "admins": {      
     ".write": false,
     ".read": true
   },

以防万一:允许所有人阅读访问此节点没有风险。

没有什么能阻止您直接向 myData 添加规则。这使管理员可以直接访问 myData(以及其中的所有节点)。如果用户不是管理员,他们只能访问自己的节点。

"myData": {
   ".read": "root.child('admins').hasChild(auth.uid)",
   ".write": "root.child('admins').hasChild(auth.uid)",
   "$user_id": {
      ".read": "$user_id === auth.uid",
      ".write": "$user_id === auth.uid"
    }
}

关于 Firebase 的 cascading security rules:要理解的关键部分是

The child rules can only grant additional privileges to what parent nodes have already declared.

基本上,如果您是管理员,那么您将被授予在 myData 级别(及其子级)的读写权限,并且没有任何东西可以撤销它。如果您不是管理员,您仍然可以获得较低级别的访问权限,如上例所示。