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_id
和auth.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,等等
我对 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_id
和auth.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,等等