允许特定用户写入访问权限

时间:2015-01-23 18:04:33

标签: firebase firebase-security

我在Firebase读/写规则上受到了阻碍。我希望我有办法设置断点,因为它检查身份验证(没有办法,是吗?)。

我的问题很简单,我觉得我应该能够更好地理解它。我觉得大部分源于完全不了解规则。此信息用于在线查看产品的简单方法,并且所有者需要能够添加产品。所以我希望世界能够阅读,登录的人能够写作。

我的数据如下:

app
 Users
    email: xxx@xxx.com
 product
   0
     name: pizza

我的规则:

 {
    "rules": {
      "product":{
        ".read": true,
        ".write":"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"
      }
    }
}

我并不清楚这意味着什么。我真的只想说,如果用户登录,则允许写入功能。我希望我可以这样".write": "auth"这意味着如果auth存在(用户登录),那就让他写。但我显然不完全明白规则的运作方式。我使用简单的电子邮件/密码验证。

如何测试这些规则以及如何将参数传递给它们?

2 个答案:

答案 0 :(得分:14)

我会尝试解释您的.write安全规则,即:

"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"

这确实不是最简单的规则,而Firebase文档确实很快就深入了解。

使用twitter登录我的应用程序后,我的代码将获得一个authData变量,告诉它:

 authData
     uid: "twitter:4511241"
     provider: "twitter"
     id: "4511241"

可能还有一些属性,但这应该是它的要点。 authData通常包含一个子对象,该对象具有特定于提供者的属性,因此在这种情况下twitter,您通常可以在那里找到一些非常有趣的东西。例如在Twitter的情况下,用户的推特名称。

 authData
     uid: "twitter:4511241"
     provider: "twitter"
     id: "4511241"
     twitter:
         userName: "puf"
         email: "puf@twitter.com" // note: this is just an example email address,
                                  // it doesn't exist (as far as I know)

此对象可供我的代码使用,默认情况下不会存储在Firebase中的任何位置。

在您的安全规则中,您可以检查相同的结构。但是这里只提供了一小部分信息,足以识别用户。 Firebase documentation for the auth object命名这些属性:

  

提供商 |使用的身份验证方法(“密码”,“匿名”,“Facebook”,“github”,“谷歌”或“推特”)。

     

uid |唯一的用户ID,保证在所有提供商中都是唯一的。

通过这些属性,我们已经可以允许特定用户对我们的数据进行写访问。就像我在你的评论中所说:

".write": "auth.uid = 'twitter:4511241'"

当我使用@puf twitter帐户登录时,这将允许我写入数据。但不幸的是,它不允许我检查更多用户友好的属性,例如电子邮件地址。

通常的做法是在Firebase中创建顶级Users节点,并为该节点下的所有用户添加由其uid标识的所有信息。所以在上面我的案例中:

 Users
     twitter:4511241
         userName: "puf"
         displayName: "Frank van Puffelen"
         email: "puf@twitter.com"
     github:913631
         userName: "puf"
         displayName: "Frank van Puffelen"
         email: "puf@github.com"

我离开了提供商和id,因为它们没有为示例提供太多价值

当您知道用户的uid时,您可以在此节点中查找其他信息。这正是您以前的安全规则所做的:

"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"

因此,这将从您的Firebase的根目录开始,查看名为Users的节点,然后是登录用户的uid以及他/她的电子邮件地址。

检查特定电子邮件地址的一个很酷的事情是,它与用户的提供商无关。因此,无论用户是使用twitter,github,facebook还是其他支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就能够写入数据。

答案 1 :(得分:0)

执行以下操作似乎可以解决问题。如果auth变量存在,则允许写入能力。由于我没有完全理解这些规则,我不得不怀疑这是针对当前用户运行还是检查是否有用户登录。

{
    "rules": {
      "product":{
        ".read": true,
        ".write":"auth !== null"
      }
    }
}