使用规则在Firebase数据库中强制执行字段的用户ID

时间:2017-07-26 00:34:08

标签: javascript firebase firebase-realtime-database firebase-security

我希望我的用户能够使用我的应用添加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"
      }
    }
  }
}

1 个答案:

答案 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属性上执行此操作将不允许用户再写实际帖子。