我是Firebase的新手,我正在尝试了解使用经过身份验证的用户ID来保护数据的规则。我在客户端上使用Angularfire2。我正在使用电子邮件/密码验证,这很好。
如果我将数据库规则设置为允许对经过身份验证的用户进行读写操作,那么一切正常,我最终会在Firebase数据库中显示以下数据...
dim1
现在我想限制经过身份验证的用户与每个对象上设置的用户ID(uid)匹配的读写权限,因此我将规则更改为以下内容...
{
"notes" : {
"-KmgjG9hxoXOTtuLTItz" : {
"content" : "test",
"title" : "Test note 1",
"uid" : "iLH4Kg20shViwJebCmU8Ynp0OG23"
},
{
"-Kmh5igvItrJstbAhRpq" : {
"content" : "test",
"title" : "Test note2",
"uid" : "iLH4Kg20shViwJebCmU8Ynp0OG23"
}
}
}
然而,这不起作用。读取失败...
错误错误:permission_denied at / notes:客户端没有 允许访问所需数据。
...并且写入失败...
FIREBASE警告:设置为/ notes / -KmgjG9hxoXOTtuLTIpG失败: PERMISSION_DENIED
我知道用户已经过身份验证,因为如果我在下面的规则中对用户ID进行硬编码,那就可以正常运行了......
{
"rules": {
"notes": {
".read": "data.child('uid').val() == auth.uid",
".write": "newData.child('uid').val() == auth.uid"
}
}
}
答案 0 :(得分:1)
我能够通过重构我的数据架构来解决这个问题,将用户ID放在路径中,而不是放在对象中,例如 / users /< -uid-> / notes / ,并使用以下规则......
{
"rules": {
"users": {
"$userId": {
".read": "$userId === auth.uid",
".write": "$userId === auth.uid"
}
}
}
}
根据有关“规则不是过滤器”的评论,我现在就明白了。绊倒我的是Firebase数据库规则doc指的是具有键值对的“孩子”,例如......
此示例仅允许在isReadable子项设置为时读取 在正在阅读的位置为true。
".read": "data.child('isReadable').val() == true"
对我来说暗示JSON数据结构是这样的......
{ ..., isReadable: true, ...}
但我猜这是指位置路径,例如/ users / fred / isReadble或类似的东西。不太确定。这看起来很奇怪。但无论如何,我让它发挥作用。
答案 1 :(得分:0)
我认为你忘记了关键:
{
"rules": {
"notes": {
"$key": {
".read": "auth.uid == 'iLH4Kg20shViwJebCmU8Ynp0OG23'",
".write": "auth.uid == 'iLH4Kg20shViwJebCmU8Ynp0OG23'"
}
}
}
}
我可能会遗漏其他内容,但您的目标是使用自动生成密钥的列表(可在规则中使用“$ somevar”访问)。