允许特定用户写访问

Allowing specific user write access

我的 Firebase read/write 规则有点受阻。我希望我有办法在检查身份验证时设置断点(没有办法,是吗?)。

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

我的数据如下:

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 存在(用户已登录)然后让他写。但我显然不完全理解这些规则是如何运作的。我正在使用简单的 email/password 身份验证。

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

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

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

我将尝试解释您的 .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 命名这些属性:

provider | The authentication method used ("password", "anonymous", "facebook", "github", "google", or "twitter").

uid |A unique user id, guaranteed to be unique across all providers.

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

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

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

一种常见的做法是在您的 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 和 his/her 电子邮件地址。

检查特定电子邮件地址的好处在于它不依赖于用户的提供商。因此,无论用户是使用 twitter、github、facebook 还是其他受支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就可以写入数据。