Firebase 允许特定的用户写访问

Firebase 允许特定的用户写访问,firebase,firebase-security,Firebase,Firebase Security,我的Firebase读/写规则有点受阻。我希望在检查身份验证时有办法设置断点(没有办法,是吗?) 我的问题相当简单,我觉得我应该能够更好地理解它。我觉得大部分原因都是因为没有完全理解规则。此信息用于在线查看产品的简单方式,所有者需要能够添加产品。所以我希望这个世界能够阅读,登录的人能够写作 我的数据如下所示: app Users email: xxx@xxx.com product 0 name: pizza 我的规则是: { "rules": {

我的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存在(用户已登录),那么就让他写。但我显然不完全理解这些规则是如何运作的。我正在使用简单的电子邮件/密码身份验证


这些规则是如何测试的,我如何向它们传递参数?

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

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

我将尝试解释您的
。编写
安全规则,即:

"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的情况下,用户的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中的任何位置

在安全规则中,您可以对照相同的结构进行检查。但这里只有一小部分信息可用,仅足以识别用户。这些属性的名称:

提供者|使用的身份验证方法(“密码”、“匿名”、“facebook”、“github”、“谷歌”或“twitter”)

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

有了这些属性,我们就可以允许特定用户对数据进行写访问。正如我在对你的回答的评论中所说:

".write": "auth.uid = 'twitter:4511241'"
这将允许我在使用@puf twitter帐户登录时写入数据。但不幸的是,它不允许我检查更多用户友好的属性,例如电子邮件地址

通常的做法是在Firebase中创建顶级
用户
节点,并添加该节点下所有用户的所有信息,这些信息由用户的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"
我把provider和id放在这里,因为它们没有为示例提供太多价值

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

"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"
因此,这将从Firebase的根目录中查找名为Users的节点,然后查找登录用户的
uid
,以及该用户的电子邮件地址


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

Hi Aarmora,这确实会允许每个人都可以读访问,也允许任何登录的用户写入产品节点。允许特定用户编写的一个简单示例是
“.write”:“auth.uid=”twitter:4511241“
。该值是我使用twitter进行身份验证时在我的一个应用程序中拥有的uid。由于这些UID不是最容易获得的,因此更常见的是在
.write
规则中查找用户的电子邮件地址,这正是您问题中的示例所做的。我将写一个答案,看看是否可以解释该规则。这一解释令人惊讶。谢谢你的大力支持。因此,如果我想将firebase中的用户“对象”更改为
Users->id->email:testuser@test.com
我原来的条件行得通吗?电子邮件匹配似乎是个很酷的主意,但这里有安全风险吗?即,数据库中的/Users节点是如何填充的?如果它是由客户端通过普通REST动词填充的,而不是由firebase服务填充的,那么有什么可以阻止我截获向/用户插入我的个人资料信息并输入我喜欢的任何电子邮件地址,例如:。joefoo@foefoo.com? 如果joefoo在您的服务中有一个帐户,我现在似乎可以访问firebase db中的他的资料。EDIT刚刚看到@PavelGeorgiev的评论,内容基本相同。