花了几天时间尝试不同的、各种推荐的方法来做到这一点,我已经找到了我认为最简单和最有希望的方法。还要感谢来自这个 SO 问题的好心人:Get the index ID of an item in Firebase AngularFire
当前设置
用户可以使用电子邮件和社交网络登录,因此当他们创建记录时,会将其保存userId
为一种外键。
目前很好。但我想创建一个规则,所以twitter2934392
无法读取facebook63203497
的记录。
关闭安全面板
匹配后端的 ID
不幸的是,文档与方法不一致,firebase 用户 ID 每个提供商(facebook、twitter、密码)都是唯一的,这建议将社交网络附加到 ID。文档希望您为每个登录方法的 id 创建不同的规则。为什么使用 >1 登录方法的任何人都想这样做,这超出了我的理解。
(来自:https ://www.firebase.com/docs/security/rule-expressions/auth.html )
因此,我将尝试将连接auth.provider
的 with 与相应项目auth.id
的记录相匹配。userId
registry
根据 API,这应该像
在我的情况下,当然使用$registry
而不是$user
。
{
"rules": {
".read": true,
".write": true,
"registry": {
"$registry": {
".read": "$registry == auth.id"
}
}
}
}
但这不起作用,因为(参见上面的第一张图片),AngularFire 将每条记录设置在一个索引值下。在上图中,它是0
. 这就是事情变得复杂的地方。
此外,我无法在模拟器中测试任何东西,因为我无法编辑{some: 'json'}
甚至进行身份验证。输入框拒绝任何输入。
我最好的猜测如下。
{
"rules": {
".write": true,
"registry": {
"$registry": {
".read": "data.child('userId').val() == (auth.provider + auth.id)"
}
}
}
}
这既会引发身份验证错误,又会同时向所有用户授予完全读取权限。我正在失去理智。我应该在这里做什么?