使用Firebase权限使数据在创建后只读

使用Firebase权限使数据在创建后只读,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在开发一个电子商务web应用程序,我需要在数据库上创建一个只读的订单,这样即使站点管理员也无法编辑用户生成的订单 这是我的规则 "orders":{ "$order": { ".read": "$order == auth.uid || auth.isAdmin == true", ".write": "$order == auth.uid && (data.child('orders').child($order).hasChildren

我正在开发一个电子商务web应用程序,我需要在数据库上创建一个只读的订单,这样即使站点管理员也无法编辑用户生成的订单

这是我的规则

"orders":{
    "$order": {
      ".read": "$order == auth.uid || auth.isAdmin == true",
        ".write": "$order == auth.uid && (data.child('orders').child($order).hasChildren(['items', 'datePlace', 'shipping', 'totalPriceOfOrder']) !== newData.hasChildren(['items', 'datePlace', 'shipping', 'totalPriceOfOrder'])"
     },
    ".read": "auth.isAdmin == true"
}
在.write at$order中,此$order==auth.uid | | auth.isAdmin==true的目的是确保只有已登录的用户才能将uid作为键写入orders对象和at项

数据的用途。child'orders'。child$order.has children['items','datePlace','shipping','totalPriceOfOrder']!==hasChildren['items'、'datePlace'、'shipping'、'totalPriceOfOrder']是为了确保只有在表以前不存在的情况下才能进行此写入

这不起作用,我不知道它为什么不起作用。

这通常表示,如果auth.uid==$order,经过身份验证的用户可以写入数据库或修改

".write": "$order == auth.uid && (data.child('orders').child($order).hasChildren(['items', 'datePlace', 'shipping', 'totalPriceOfOrder']) !== newData.hasChildren(['items', 'datePlace', 'shipping', 'totalPriceOfOrder'])"
只读

".read": "$order == auth.uid || auth.isAdmin == true"
".write": "!data.exists()"

这个!data.exists将允许您向数据库写入一次,并且不允许更新或删除。用户可以阅读,但不能更新。

您的解决方案有效,但似乎存在另一个问题,auth.isAdmin被拒绝对客户端的权限,但不能对模拟进行访问。请详细说明。因此,我可以使用下面提供的答案将此设置为只读,但根据我的新规则,我注意到isAdmin无法读取对象,这是新规定。订单:{$userOrders:{.read:$userOrders==auth.uid | | auth.isAdmin==true、.write:!data.exists}、.read:auth.isAdmin==true},