我有点受阻于我的 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/