我希望我的用户能够使用我的应用添加posts
。我需要知道谁发了每个帖子,所以客户使用
this.firebaseapp.database().ref('posts/').push({
userId, text, timestamp:new Date()
});
从技术上讲,有人可以修改客户端并发送userId
的任何值,因此我需要一个数据库规则来阻止这种情况。
Firebase网站上的用户数据示例提及:
{
"rules": {
"users": {
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".write": "$user_id === auth.uid"
}
}
}
}
我认为我基本上想要.write
限制,但由于Posts
是一个不同的数据集,我不想使用Post键,我想引用传入的值
这是我尝试的内容,但它允许发布帖子:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"posts": {
"userId": {
".write": "newData.val() === auth.uid"
}
}
}
}
答案 0 :(得分:1)
第一个代码段在语法上是不正确的。但是,让我们假设你的意思是:
this.firebaseapp.database().ref('posts/').push({
userId: userId, text: text, timestamp:new Date()
});
您想要的规则是:
{
"rules": {
".read": "auth != null",
"posts": {
"$postid": {
".write": "newData.child('userId').val() === auth.uid"
}
}
}
}
关键区别:
".write"
规则。权限级联:一旦您授予某个级别的访问权限,就不能将其从较低级别删除。$postid
,这是必需的,因为此规则需要应用于/posts
下的所有子节点。 $postid
实际上只是一个允许它的通配符规则。userId
属性上执行此操作将不允许用户再写实际帖子。