object 的 Firebase 规则仅适用于创建者和管理员用户

Firebase Rules for object only for creator and admin user

我对 Firebase 规则真的很困惑,需要一些帮助。我在谷歌上搜索了很多,但实际上变得更加困惑,但仍然无法正常工作。

假设我有一个像这样的 Firebase 数据库 object:

root/orders/$id

$id 里面,我有一个 child user_id:

root/orders/$id/user_id

现在我想要一个规则,只允许用户阅读他自己的订单(但不再写在现有的一次,他怎么需要创建新的一次)另外我希望管理员用户 READ/WRITE随时所有订单。

到目前为止我想到了这个

  "orders": {
    "$id": {
        ".read": "root.child('orders').child($id).child('user_id').val() == auth.uid || root.child('users').child(auth.uid).child('admin').val() == 'user_is_admin'",
        ".write": "root.child('users').child(auth.uid).child('admin').val() == 'user_is_admin'"          
        },
        ".write": "root.child('users').child(auth.uid).child('admin').val() == 'user_is_admin'",
        ".read": "root.child('users').child(auth.uid).child('admin').val() == 'user_is_admin'",                  
        ".indexOn": ["status", "user_id"]
   },

我的管理员在我的用户中被标记为管理员 table:

root/users/$id/admin (== user_is_admin)

我的目的是在第一部分允许具有与请求的 /orders/$id/user_id 相同 auth.uid 的用户阅读他们的订单,并允许管理员读写。管理部分工作正常,但我的用户由于某种原因无法访问。

第二部分是让管理员 read/write 访问所有订单(没有特定 $id),这也可以正常工作,而且普通用户需要在此处写入以创建新订单。

恢复我的规则的管理部分有效,但用户部分无效。 1.我的用户看不懂是自己的订单 2. 我的用户无法创建新订单

如果有人能帮助我,我会很高兴。

规则:

以下规则应强制执行您在问题中概述的政策:

"orders": {
  "$id": {
    ".read":  "data.child('user_id').val() === auth.uid",
    ".write": "!data.exists() && newData.child('user_id').val() === auth.uid"
  },
  ".write": "root.child('users').child(auth.uid).child('admin').val() === 'user_is_admin'",
  ".read":  "root.child('users').child(auth.uid).child('admin').val() === 'user_is_admin'",
  ".indexOn": ["status", "user_id"]
}

请注意,Firebase 安全规则级联,因此一旦您向 orders 的管理员授予 read/write 权限,就无需重复 orders/$id 的规则。 (需要记住的是——尽管这不是您的规则的问题——一旦您授予 parent 权限,您就无法在 child 上撤销它。)

orders/$id/.read规则使用data.child来比较user_idauth.uid。这与您的规则相同,只是短了一点并且不包括管理员检查(级联)。

除了检查 newData(正在写入的值)是否包含 user_id 之外,orders/$id/.write 规则还会检查 data(先前的值)不存在。这将允许创建,但将拒绝更新和删除。

用户订单:

如您的评论所述,用户无法查询 orders 键下的订单列表,因为该用户无权阅读其他用户的订单(他们' d 需要可读才能被过滤掉)。您可以通过按用户存储订单映射来解决问题,如下所示:

"orders": {
    "order_1": {
        "user_id": "user_1",
        ...
    },
    "order_2": {
        "user_id": "user_1",
        ...
    },
    "order_3": {
        "user_id": "user_2",
        ...
    }
},
"ordersByUser": {
    "user_1": {
        "order_1": true,
        "order_2": true
    },
    "user_2": {
        "order_3": true
    }
}

您可以使用 Firebase 的 multi-location 更新来简化维护映射的工作。例如,要为 user_1 添加另一个订单,您可以这样做:

firebase.database().ref().update({
    "orders/order_4": {
        "user_id": "user_1",
        ...
    },
    "ordersByUser/user_1/order_4": true
});

这将使用户获得订单 ID 列表(以及从这些 ID 中获得的订单本身),管理员用户仍然可以获得所有订单的列表,等等。

此外,您应该包含一条规则,以便用户只能在 ordersByUser 下读取自己的订单 ID,等等