Firebase安全规则不起作用

时间:2017-08-22 00:46:42

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

我在Web应用程序中使用Firebase Authentification,我使用电话号码验证作为登录应用程序的选项。

function saveUser(fname) {
    var user = firebase.auth().currentUser;
    var newUserRef = firebase.database().ref('users/' + user.uid);
    newUserRef.set({
        fname: fname
    });
}

根据以下数据库规则:

{
  "rules" : {
    ".read"  : false,
    ".write" : false,
    // only authenticated users can write
    "users": {
      ".read": "auth != null",
      "$user_id": {
          "fname": {
            ".read": "auth != null",
            ".write": "auth != null",
            ".validate": "newData.isString() && newData.val().matches(/^[A-Z]{3,}$/)"
          },
      }
    }
  }
}

然而,我一直收到错误:

  

FIREBASE警告:设置为/ users / ypGXpJRM1wdMOuOMf8F7quLnJ073失败:   PERMISSION_DENIED

有没有办法在不改变规则的情况下避免此错误?

2 个答案:

答案 0 :(得分:3)

您的规则允许撰写的第一个级别位于/users/$uid/fname。但是您的代码尝试写入/users/$uid。由于您没有写权限,因此数据库拒绝写操作。

您有两种方法可以解决此问题:允许写入/users/$uid或写入/users/$uid/fname

允许写入/users/$uid

要允许写入/users/$uid,请将规则更改为:

"users": {
  ".read": "auth != null",
  "$user_id": {
      ".write": "auth != null",
      "fname": {
        ".read": "auth != null",

事实上,您可能希望确保用户只能编写自己的节点,您可以使用以下节点:

"users": {
  ".read": "auth != null",
  "$user_id": {
      ".write": "auth.uid === $uid",
      "fname": {
        ".read": "auth != null",

写入/users/$uid/fname

您当前的代码尝试写入您没有权限的地方。由于您只编写fname,因此您也可以写入该特定位置以消除错误:

var newUserRef = firebase.database().ref('users/' + user.uid);
newUserRef.child('fname').set(fname);

鉴于数据结构,我可能会去修改安全规则。

答案 1 :(得分:0)

这些规则阻止了所有访问:

".read"  : false,
".write" : false,

您可以在Firebase数据库规则模拟器工具中轻松测试数据库安全规则。