Firebase数据库规则专用节点

时间:2016-06-17 12:17:56

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

我正在做一个groceryItem应用程序,用户可以添加项目,只能看到自己的项目 我使用childByAutoId添加我的项目,并为每个项目获取唯一的密钥条目(参见图片#1)。 enter image description here

每个项目都有3个属性。 addedByUser是经过身份验证的用户的UID,当然还有名称和数量。

我在设置规则时遇到问题,以便只有用户才能看到自己的项目。我现在的规则是这样的(见图2)。 enter image description here

如果我与其他用户登录,他可以阅读所有项目。所以我的问题是: 如何让创建它们的用户可读取项目?

我认为itemsaddedByUser之间存在差距,因为我之间有childByAutoId。如果您有任何解决方案或提示我如何以更好的方式构建它,请随时帮助我。

提前致谢!

1 个答案:

答案 0 :(得分:2)

$ addedByUser可能在此示例中位于错误的位置,因为它不是项目的“嵌套子项”,而是子项的属性。我建议(没有测试过这个)你会找到类似的东西:

"items": {
  "$item": {
    ".read": "data.child('addedByUser').val() === auth.uid"
  }
}

这取自Firebase docs

使用数据:

{
  "messages": {
    "message0": {
      "content": "Hello",
      "timestamp": 1405704370369
    },
    "message1": {
      "content": "Goodbye",
      "timestamp": 1405704395231
    },
    ...
  }
}

规则可以是:

{
  "rules": {
    "messages": {
      "$message": {
        // only messages from the last ten minutes can be read
        ".read": "data.child('timestamp').val() > (now - 600000)",

        // new messages must have a string content and a number timestamp
        ".validate": "newData.hasChildren(['content', 'timestamp']) && newData.child('content').isString() && newData.child('timestamp').isNumber()"
      }
    }

} }

这样可以防止错误的用户阅读别人的(单数)项目,并且在您的示例中会阻止用户SZ825V ...对“items / -KKTDD ...”执行读取,但是如果用户SZ825V是对“项目”执行读取,然后读取将完全失败,因为用户正在尝试阅读他们自己的文档和其他人的文档。这是firebase中的一个重要概念,规则以原子方式运行 - 也就是说,如果读取的一部分失败,则整个读取都会执行。另一种表达方式是规则不作为过滤器。 如果这是您正在寻找的功能,则可能需要重新排列您的结构。一个例子如下:

{
  "users": {
    "abcdef-user-id": {
      "items": {
        "fjeiwofjewio": {
           "name": "apple",
           "qty": "23"
        }
      }
    },
    "ghijkl-user-id": {
      "items": {
        "regrewgreh": {
          "name": "passionfruit",
          "qty": "18"
        }
      }
    }
}

和安全规则可能是:

.. {
     "users": {
       "$userId": {
          ".read": "auth.uid === $userId"
       }
     }
   }

上述方法假设您只希望允许用户读取其用户自己的数据树中的项目,是否其他任何人都无法看到任何其他用户的项目。如果您确实希望其他用户看到其他用户的某些项目,则需要再次采用不同的方法,这将是另一个SO问题。