Firebase中的多个管理员 - 是否可以?

时间:2015-08-30 20:58:23

标签: javascript firebase


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

我的数据架构如下所示:

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

我正在尝试允许已登录的用户在“数据”对象内写入其位置(我正在使用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)"
       }
   }
 }
  • 我正在使用我每次要将用户设为管理员时运行的本地节点服务手动将用户添加到'admins'

当然这不起作用,因为'myData'没有明确的读/写权限定义 - 所以当我尝试用ref.child('myData').once('value', function() {..})读取uid时,'admins'是在'admins - 我无法这样做。

我正在尝试运行以下查询并向用户表明其uid位于permission denied并获得ref.child('myData').once('value', function(snapshot) {console.log(snapshot.val())}, function() {console.log(arguments)}))

data.combined <- rbind(train, test.survived)

甚至可以做我想做的事情吗?

2 个答案:

答案 0 :(得分:4)

没有什么可以阻止您直接向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:要理解的关键部分是

  

子规则只能授予其他权限   父节点已经声明。

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

答案 1 :(得分:1)

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

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

如果您担心:允许每个人读取访问此节点都没有风险。