【问题标题】:Access a node/path by two specific users only仅由两个特定用户访问节点/路径
【发布时间】:2014-10-30 15:31:04
【问题描述】:

我已经阅读并尝试了非规范化,虽然它对于像 cmets/messages 这样可以公开访问而用户只能写入自己的路径/节点的情况非常有意义,但我很难限制“。读取”规则给用户/所有者和另一个用户/管理员。我的用例没有公开发布所有消息。举例来说,user1 的消息只有 user1 和 admin 可读,而 user1 仍然只写。

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: firebase angularfire firebase-security


    【解决方案1】:

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

    首先假设您的管理员是一个已知用户,其 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"
      }
    }
    

    【讨论】:

    • 嗨弗兰克。感谢您的反馈。但是,由于顶部节点“消息”不可读,管理员用户如何获取所有用户的消息?向“.read”发送“消息”:true 将使其公开,这与目标背道而驰。还有其他提示吗?再次感谢。
    • 您可以在此处添加类似的.read 规则,只允许管理员:".read": "root.child('administrators/'+auth.uid).exists()"
    • 确认这允许管理员访问所有消息,但现在每个特定用户无法再访问他们自己的节点。我知道这是因为级联安全规则:firebase.com/docs/security/guide/… 有没有办法将权限“附加”到用户级别的顶级?
    • 级联仅适用于授予的权限。如果用户在顶部消息节点上被拒绝读取权限,他们仍然可以被授予对其较低 $user_id 节点的权限。
    • 感谢@Anid Monsur。这有助于为解决方案铺平道路。所以我最终重组了消息节点并添加了这些规则:code "messages": { ".read": "root.child('users/'+auth.uid+'/roles/administrator').exists( )", "$user_id": { ".read": "auth.uid === $user_id || root.child('users/'+auth.uid+'/roles/administrator').exists()", ".write": "auth.uid === $user_id" } }code
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2021-12-18
    • 2021-05-21
    • 2020-01-31
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多