基于子级的Firebase实时数据库添加规则

时间:2019-04-09 04:37:16

标签: firebase firebase-realtime-database

我把规则定为

(root.child('users').child(auth.uid).child('role/cafe').val() === true)

在我的实时数据库规则中。

我的用户是

key {
 uid: xxxx 
 name: xxxx
 role:{
  cafe: true
  user: false
  }
}

如果auth.uid等于key,则该规则有效,但是如何修改上述规则以在数据内部查找uid

2 个答案:

答案 0 :(得分:0)

您可以使用通配符。在您的规则中

"users":{
  "$key":{
    ".read" : (root.child('users'+$key).child('role/cafe').val() === true) && (root.child('users'+$key).child('uid').val() === auth.uid  ),
    ".write" : (root.child('users'+$key).child('role/cafe').val() === true  ) &&(root.child('users'+$key).child('uid').val() === auth.uid  )
  }
},

第一个条件检查用户的café值是否为真,第二个条件检查uid是否相同

答案 1 :(得分:0)

目前尚不清楚$key的值是什么。因此,我假设这只是规则中未使用的一些随机字符串。

对于每个安全规则,可以使用predefined variable data访问节点的当前数据。 ".write"".validate"规则还可以访问newData作为要写入的数据。这些都是RuleDataSnapshot对象。

假设进行更改的用户必须是uid属性指定的用户,则可以使用以下规则。

"rules": {
  "users": {
    "$key": {
      ".read": "auth != null && data.child('uid').val() == auth.uid",
      ".write": "auth != null && ((data.exists() && data.child('uid').val() == auth.uid) || (!data.exists() && newData.child('uid').val() == auth.uid)"
    }
  }
}

以上规则使用fail-fast方法。如果用户未登录,则检查中止。否则,将用户的ID与给定节点上的现有数据进行匹配。如果数据还不存在,则新更新的数据还必须与当前用户的ID匹配。

在“咖啡馆”角色很重要的情况下,以下规则还要求将“咖啡馆”设置为true,以允许进行读/写操作。

"rules": {
  "users": {
    "$key": {
      ".read": "auth != null && data.child('uid').val() == auth.uid && data.child('role/cafe').val() == true",
      ".write": "auth != null && ((data.exists() && data.child('uid').val() == auth.uid && data.child('role/cafe').val() == true) || (!data.exists() && newData.child('uid').val() == auth.uid && newData.child('role/cafe') == true))"
    }
  }
}

注意:如果$key正在存储用户信息/数据,我强烈建议使用用户ID作为密钥,因为安全规则无法执行“用户ID是否具有管理员角色?”之类的查询。而不构造您的数据以允许它。如果$key是用户名,请改用用户名到用户ID映射,因为这样可以防止将来出现问题。一个这样的例子是,如果用户想要更改其用户名,则可以删除新的用户名并将其链接到该用户,而不必移动其所有数据。