允许特定用户写访问
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 还是其他受支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就可以写入数据。
我的 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 还是其他受支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就可以写入数据。