Firebase - 基于用户的另一条路径上的规则访问

时间:2015-10-11 19:38:10

标签: path firebase rules

我希望只有当用户在其帐户下列出此设备ID时才允许对firebase中的设备列表进行读取访问。

正如Anant在他的回答中所建议的那样:Security Rules - lists of data that can be read? 我实现了这个firebase数据结构:

{ 
  devices: { 
    111: {status: 10}, 
    222: {status: 5}
  }, 
  users:  {
    aaa: { 
      name: 'Jim', 
      devices: { 
        111: {name: 'Test Device'}
      } 
    } 
    bbb: { 
      name: 'Jane', 
      devices: { 
        111: {name: 'Test Device'},
        222: {name: 'New Device'}
      } 
    } 
  }
}

澄清产出,用户" aaa"名叫Jim应该只能读取设备ID" 111"从设备列表中获取它的子元素。用户" bbb"名叫简可以看到两个设备" 111"和" 222"和他们的孩子元素

所以我实施了几项规则试验,结束了以下内容:

{
    "rules": {
        "users":{
          "$user_id":{
            ".read": "auth.uid == $user_id",
            "devices": {
              "$devices_id":{
                ".read":true
              }
            }
          }
        },
        "devices":{          
          "$devices_id":{
            ".read": "root.child('users').child(auth.uid).child('devices').hasChild('$devices_id')",
            ".write": false
          }
        }
    }
}

在读取设备数据时,此规则应查看/ root / users // devices / $ devices_id,并查看发出请求的用户下是否存在该device_id。然后允许对该记录的读访问权限。根据上面链接的帖子,这应该是可能的,但帖子没有表明应该为"对话"的主要列表设置什么权限。 (在我的情况下是设备)... Anant只会说"确保在顶级对话列表中正确设置权限"。有人可以澄清如何做到这一点吗?

根据上述规则,我只会根据这些请求获得许可。我也尝试过: "root.child('users').child(auth.uid).child('devices').child('$devices_id').exists()" 这也不起作用......

非常感谢有关此过程的任何指导。我也对其他数据结构和规则结构持开放态度。这是一个新项目,在这个阶段非常可修改。

谢谢!

1 个答案:

答案 0 :(得分:1)

感谢@Kato!除了$ device_id周围的字符串文字外,上面的实现是正确的。

更改

.hasChild('$devices_id')

.hasChild($devices_id)

修复了问题,并且只允许从顶层设备结构中读取用户下的已分配设备。