由于Firebase规则不是过滤器,我们如何过滤?

时间:2016-12-19 06:26:02

标签: android firebase database-design firebase-realtime-database nosql

我正在尝试一组聊天,其中包含参与者列表,并且能够查询每个用户的聊天列表用户是参与者的位置。

因为在服务器端的Firebase中无法进行过滤(我猜可扩展性),我知道我必须为资源中的所有“过滤”形式准备所有数据,所以我有以下结构现在:

database structure screenshot

这些是我为保护数据而编写的规则:

{
  "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()来阻止访问它,如果用户不是该参与者的参与者聊天。

还有其他方法吗?它是要走的路吗?

1 个答案:

答案 0 :(得分:2)

您可以直接将聊天记录的密钥设置为/users/<uid>/chats下的true作为值,而不是按下新密钥来设置聊天记录的ID。

{
    "users": {
        "<uid>": {
            "chats": {
                "<chat_id>" : true,
                "<chat_id2>" : true
            }
        }
    }
}

使用此结构,对于正确的用户,读取访问的firebase数据库规则应为true。