【问题标题】:Firebase - how to restrict authenticated user's access to certain paths?Firebase - 如何限制经过身份验证的用户对某些路径的访问?
【发布时间】:2018-03-12 22:30:32
【问题描述】:

足够简单的问题:

如何限制路径,比如...

/orders/<userid>

/cart/<userid>

/transactions/<userid>/txid

...仅适用于userid 与路径中匹配的用户?

我已经设置了身份验证,我需要在 firebase.auth().onAuthStateChanged 之后在 Vue 中订阅其中的一些内容

根据此处的文档,在以下规则示例中,用户令牌必须与密钥完全匹配:

{
  "rules": {
    "users": {
      "$user_id": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($user_id)
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

这是否意味着/orders/123456/order123478 将受到限制,并且仅对用户123456 可用?

【问题讨论】:

    标签: javascript firebase-realtime-database firebase-authentication firebase-security


    【解决方案1】:

    对于实时数据库,将您的规则更新为如下内容:

    {
      "rules": {
        "orders": {
          "$uid": {
            ".read": "auth.uid == $uid",
            ".write": "auth.uid == $uid"
          }
        }
      }
    }
    

    $uid 键表示嵌套在该级别的任何键,并允许您在规则中引用它。 auth 变量由 Firebase 提供,其中包含有关发出请求的经过身份验证的用户的详细信息,因此您可以将请求用户的 uid 与数据库的 uid 密钥进行比较,并在它们匹配时授予权限(嵌套的 ".read"".write" 值)。

    因此对于uiduser1 的用户,他们将有权访问以下数据:

    {
      "orders": {
        "user1": {
          "order1": read/write,
          "order2": read/write
        },
        "user2": {
          "order1": no access,
          "order2": no access
        },
        "user3": {
          "order1": no access,
          "order2": no access
        },
    }
    

    阅读 documentation 并使用 Firebase 仪表板“规则”部分中的模拟器。

    【讨论】:

    • 我理解正确吗 - $uid 包括从根目录开始的每一个键?
    • @dsp_099 答案已更新。您还可以使用 Firebase 信息中心“规则”部分中的模拟器验证您的规则。
    • 感谢您的快速回复。在相关的说明中,你能想到任何具有类似设置的类似食谱的 github 项目吗?鉴于这种访问机制,看看如何组织“模式”会很有帮助
    • @dsp_099 没问题...我最近经历了这个学习曲线,没有任何一刀切的方法,所以你只需要尝试并犯一些错误. Firebase 团队有一些示例应用可供您查看:firebase.google.com/docs/samples。还有一些人发表了有关如何在 NoSQL 数据库(有时特别是使用 Firebase)中构建数据的文章/视频,例如 Chris Esplin:youtube.com/watch?v=QEd2lEoXpp4
    • 非常好,谢谢。最后一个问题:(我相信我最终会在视频中找到答案)如果数据的结构像上面那样,那么获取订单键是否也会自动将所有用户拉到它下面,还是我误解了它是如何工作的?应该是用户,然后是订单/交易等,以避免为每个请求加载整个数据库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2016-01-15
    • 2016-10-09
    • 1970-01-01
    • 2013-11-14
    • 2021-10-14
    相关资源
    最近更新 更多