【问题标题】:Firebase complex rulesFirebase 复杂规则
【发布时间】:2017-08-05 22:01:19
【问题描述】:

假设我的 Firebase 数据库中有以下数据结构:

{
  "allProjects": {
    "foo": true,
    "bar": true,
    "baz": true
  },
  "allUsers": {
    "user1": true,
    "user2": true,
    "user3": true
  },
  "projects": {
    "foo": {
      "name": "foo",
      "members": {
        "user1": true
      }
    },
    "bar": {
      "name": "bar",
      "members": {
        "user2": true
      }
    },
    "baz": {
      "name": "baz",
      "members": {
        "user1": true,
        "user3": true
      }
    }
  },
  "users": {
    "user1": {
      "name": "user1"
    },
    "user2": {
      "name": "user2"
    },
    "user3": {
      "name": "user3"
    }
  }
}

问题

我正在尝试编写一些规则,以便保护我的数据。以下是一些要求:

  1. 用户只能看到他们参与的项目(即/project/:id/members/:userId === true
  2. 用户只能看到与他们属于同一项目的用户。

这是我能想到的:

{
  ".read": false,
  ".write": false,
  "allProjects": {
    ".read": "auth !== null"
  },
  "allUsers": {
    ".read": "auth !== null"
  },
  "projects": {
    "$projectId": {
      // requirement 1
      ".read": "data.child('members').hasChild(auth.uid)"
    }
  },
  "users": {
    "$userId": {
      // requirement 2
      ".read": "???",
    }
  }
}

【问题讨论】:

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


    【解决方案1】:

    典型的方法是保留每个用户可以看到的用户列表。

    user_friends: {
      "user1": {
        "user3": true
      }
      "user3": {
        "user1": true
      }
    }
    

    然后,当用户被添加到项目中/从项目中删除时,您需要保持这个派生列表是最新的。或者,您可以在计划维护操作中计算此派生列表。

    像这样复制数据是 SQL 数据库和大多数 NoSQL 数据库之间的一大区别。在 Firebase 中,我们经常存储额外的数据以供我们的用例使用。对于精彩的介绍,我建议阅读NoSQL data modeling 并观看Firebase for SQL developers

    顺便说一句,我注意到您已将元数据合并到/projects/$projectid 下的用户列表。不建议这样做。为获得最佳效果,请将它们分成两个顶级列表。

      "projects": {
        "foo": {
          "name": "foo",
        },
        "bar": {
          "name": "bar",
        },
        "baz": {
          "name": "baz",
        }
      },
      "members": {
        "foo": {
            "user1": true
        },
        "bar": {
            "user2": true
        },
        "baz": {
            "user1": true,
            "user3": true
        }
      },
    

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2012-05-13
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2015-11-08
      相关资源
      最近更新 更多