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



我正在使用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].peoples[j]的用户能够更新此人的状态。

作为firebase的新手,我想我可以使用如下的更新功能

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

问题是,我找不到任何方法让秘密只写出来,同时允许人们访问。也就是说,我需要任何人都能够提取位于房间[I].peoples的数据——意思是房间[I].Peoples必须具有".read":true(在firebases安全规则中)。但这将为每个孩子提供阅读权限,房间里的任何人都可以看到其他人的更新秘密。我是不是想错了这个问题?

有没有一种方法可以让家长进行阅读,但将一些孩子排除在结果之外?

谢谢!

这在一定程度上取决于您如何使用机密来实现授权,但我怀疑取消规范化数据会起到作用。试试这样的东西:

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>"
        }
      }
    }

相关内容

  • 没有找到相关文章

最新更新