【问题标题】:Firebase security rules not worksFirebase 安全规则不起作用
【发布时间】:2018-01-30 03:14:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你在模拟器中测试过这些规则吗?

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


【解决方案1】:

您的规则允许写入的第一级位于/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);

考虑到数据结构,我可能会修改安全规则。

【讨论】:

    【解决方案2】:

    这些规则阻止所有访问:

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

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

    【讨论】:

    • 我按照建议和模拟的方式删除了。但是,没有任何变化。
    • 我将 ".write" : false 改为 ".write" : "auth != null" 并且工作正常!谢谢
    • 只是需要强调的一点,如果它们设置在较浅的层中,读和写将覆盖更深的规则。只有 .Validate 应用于正在应用的节点,而不需要更深入地更改任何内容。干杯
    • 如果您在数据库的根目录上进行了更改,任何经过身份验证的用户现在都可以写入整个数据库。虽然这很方便,但它可能不是您想要的安全模型(考虑到您开始使用的内容)。
    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 2020-08-24
    • 2021-12-24
    • 2016-06-03
    • 2017-08-02
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多