firebase - 允许特定用户写访问

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

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

最佳答案

我会尽力解释你的.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 的情况下,用户的 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 twitter 帐户登录时写入数据。但不幸的是,它不允许我检查更多用户友好的属性,例如电子邮件地址。

一个常见的做法是创建一个顶级 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 留在这里,因为它们没有为示例提供太多值(value)

当您知道用户的 uid ,您可以在此节点中查找他的附加信息。这正是您之前拥有的安全规则所做的:
"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"

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

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

关于firebase - 允许特定用户写访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115998/

相关文章:

ios - 在 swift 中查询 firebase 数据库的中间部分

ios - CocoaPods:pod 安装给出 "Errno::E2BIG - Arg list too long"

firebase - 将 Firebase 崩溃报告更新为 Firebase Crashlytics : still on old dashboard

google-cloud-firestore - Firestore 模拟器和调试安全规则

javascript - Firebase UID 总是 28 个字符吗?

javascript - Firebase 仅允许创建者发帖

Firebase 存储结构示例

android - auth.uid 在 firebase 规则中不起作用

google-cloud-firestore - Firestore 安全规则 - 更新一个特定字段而不提供其他字段的数据

android - 如何在 RecyclerView 上滑动删除?