从具有读访问权限的firebase节点中排除子项

时间:2014-09-11 04:55:48

标签: firebase firebase-security

我正在使用firebase创建一个简单的聊天应用程序,并且遇到了可用安全设置的一些问题。

此应用程序的数据模型非常简单,如下所示

rooms:[
    people:[
        {
            name: //string
            status: // what the user is doing, typing, still connected etc.
            secret: // the problem is with this
        }
    ],
    messages:[
        {/* message to and payload*/}
    ]
]

问题是我只希望创建房间[i] .people [j]的用户能够更新该人的状态。

成为firebase的新手,虽然我可以使用更新功能,如下所示

personRef.update({
    'status': // newStatus
    'secret': // used to authorize the update
})

这个问题是我无法找到任何方法来使秘密只写,并同时给予人们访问权限。那就是我需要任何人能够提取位于房间[i] .people的数据 - 意味着房间[i]。人们必须拥有" .read":true(在firebases安全规则中)。但这会给每个孩子提供阅读权限,房间里的任何人都可以看到任何其他人的更新秘密。我错误地想到了这个问题吗?

有没有办法给父母提供读取权限,但是从结果中排除了一些孩子?

谢谢!

1 个答案:

答案 0 :(得分:2)

这取决于你如何使用秘密来实现授权,但我怀疑对数据进行非规范化是有用的。尝试这样的事情:

people-secrets:[
    <user's ID>: {
        secret: 
    }, ...
],
rooms:[
    people:[
        {
            name: //string
            status: // what the user is doing, typing, still connected etc.
        }
    ],
    messages:[
        {/* message to and payload*/}
    ]
]

这将允许您细分安全规则:

{
  "rules": {
    "people-secrets": {
      "$user_id": {
        ".read": "$user_id === auth.uid",
        ".write": "$user_id === auth.uid"
      }
    },
    "rooms": {
      "$room_id": {
        "$user_id": {
          ".read": "auth.uid != null",
          ".write": "$user_id === auth.uid && root.child('people-secrets/' + auth.uid + "/secret") === <that token>"
        }
      }
    }