我正在尝试一组聊天,其中包含参与者列表,并且能够查询每个用户的聊天列表用户是参与者的位置。
因为在服务器端的Firebase中无法进行过滤(我猜可扩展性),我知道我必须为资源中的所有“过滤”形式准备所有数据,所以我有以下结构现在:
这些是我为保护数据而编写的规则:
{
"rules": {
"users": {
"$user_id" : {
"chats" : {
".read":"auth != null && $user_id == auth.uid",
".write": "auth != null && !data.exists()"
}
}
},
"chats": {
"$chatId": {
".read":"auth != null && root.child('users').child(auth.uid).child('chats').child($chatId).exists()",
".write": "auth != null && !data.exists()"
}
}
}
}
第一条规则(/ users /& user_id / chats)正常并且按预期工作。我可以通过user_id进行查询,并获取用户应该有权访问的所有chat_id的地图。
第二个规则失败了,因为我认为我拥有的是 chat_id ,但我真正拥有的是包含chat_id为 uid 的属性的对象的ID,我不能在不知道身份证的情况下找个孩子,如 rules are not filters 。
我看到我可以保护聊天的唯一方法是为参与者列表提供一个字符串,然后在聊天的孩子上使用contains()来阻止访问它,如果用户不是该参与者的参与者聊天。
还有其他方法吗?它是要走的路吗?
答案 0 :(得分:2)
您可以直接将聊天记录的密钥设置为/users/<uid>/chats
下的true
作为值,而不是按下新密钥来设置聊天记录的ID。
{
"users": {
"<uid>": {
"chats": {
"<chat_id>" : true,
"<chat_id2>" : true
}
}
}
}
使用此结构,对于正确的用户,读取访问的firebase数据库规则应为true。