仅由两个特定用户访问节点/路径

时间:2014-10-30 15:31:04

标签: firebase angularfire firebase-security

我已经阅读并尝试了非规范化,虽然对于可以公开访问的评论/消息等情况非常有意义,而用户只能写入自己的路径/节点,但我很难限制“。阅读“规则给用户/所有者和另一个用户/管理员。我的用例不会公开发布所有邮件。例如,要说明user1的消息只能由user1和admin读取,同时仍保留对user1的只写。

这是如何实现的?在安全规则中,我尝试过:

"messages": {
   ".read": "auth !== null",
   ".write": "auth !== null",
   "$message": {
      ".read": "data.child('userID').val() === auth.uid"
   }
}

OR

"messages": {
   ".write": "auth !== null",
   "$message": {
      ".read": "data.child('userID').val() === auth.uid"
   }
}

OR

"messages": {
   "$user_id": {
      ".read": "auth.uid === $user_id"
      ".write": "auth.uid === $user_id"
   }
}

虽然最后一个确实限制读取和写入经过身份验证的用户,比如user1,但我没有运气让管理员用户获取所有用户的消息。第一,我无法规避级联/自上而下的规则。

我是一个firebase新手,所以如果这很简单,我会感激任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

这取决于您如何定义管理员。

我们首先要说您的管理员是uid SOF的已知用户。

"messages": {
   "$user_id": {
      ".read": "auth.uid === $user_id || auth.uid == 'SOF'"
      ".write": "auth.uid === $user_id"
   }
}

如果您希望管理员可配置,您可能会将其ID存储在其他位置,例如在名为administrators的节点中:

administrators
    SOF: true
    Frank: true
messages
    ...

在这种情况下,您可以检查当前uid是在当前节点中还是存在于管理员列表中:

"messages": {
   "$user_id": {
      ".read": "auth.uid === $user_id || root.child('administrators/'+auth.uid).exists()"
      ".write": "auth.uid === $user_id"
   }
}

更新

由于您希望管理员能够阅读所有邮件,因此您最终会:

"messages": {
  ".read": "root.child('administrators/'+auth.uid).exists()",
  "$user_id": {
    ".read": "auth.uid === $user_id",
    ".write": "auth.uid === $user_id"
  }
}