Firebase使用auth.uid作为密钥并向其及其子级添加规则

时间:2014-10-09 13:13:51

标签: firebase

我有一个数据结构,可以将用户的数据添加到其唯一ID中,如下所示。

"users" : 
    {
        "user_id":
        {
            "name":"John Doe",
            "email":"email@example.com",
            "account":"limited",
            "avatar" : "this will be a base64 data string"
        }
    }

我想拒绝用户列出其他用户,并且我还希望登录用户根据他们的" user_id"来访问他们的数据。这是从auth.uid获得的

我曾尝试过一些规则:

{
    "rules" : 
    {
        "users" : 
        {
            ".read" : "false",
            ".write" : "auth != null && !data.exists() && newData.exists() ",
            ".validate" : "newData.child('user_id').hasChildren(['name', 'email', 'account','avatar'])",
            "user_id" : 
            {
               ".read" : "auth.uid === user_id",
               ".write" : "false",
               "avatar" : 
                {
                     ".write" : "!data.exists() && newData.exists() && auth.uid === user_id",
                     ".read" : "auth.uid === user_id"
                }           
            }
        }
    }
}

现在请记住" user_id"可以是任何东西,每个用户都有变化,我该如何实现呢?对于我可以解决这个问题的方法,您有其他建议吗?

1 个答案:

答案 0 :(得分:8)

您需要仔细查看此处的Firebase文档:https://www.firebase.com/docs/security/guide/user-security.html

您需要使用通配符路径来代表每个用户,如下所示:

{
  "rules": {
    "users": {
      "$user_id": { //this is the WILDCARD path
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($user_id)
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

通配符路径说明:https://www.firebase.com/docs/security/api/rule/path.html

最后,我不建议以这种方式存储电子邮件,因为无论如何都可以通过simpleLogin来存储。