【问题标题】:How to use Firebase rules to only give permission to certain leaf nodes如何使用 Firebase 规则仅授予某些叶节点权限
【发布时间】:2014-01-29 02:40:11
【问题描述】:

我的基本问题是如何设置 Firebase 规则以仅允许从其父节点访问某些叶节点?

假设我有如下数据:

root: {
  posts: {
    post1: {
      user: "foo",
      post: "this is a post",
      restricted: false
    },
    post2: {
      user: "bar",
      post: "this is another post",
      restricted: true
    },
    post3: {
      user: "bar",
      post: "this is my final post",
      restricted: false
    }
  }
}

我想$bind 到帖子节点并获取允许该用户获取的所有帖子。我可能希望管理员访问所有帖子,但非管理员只能访问 post1 和 post3。

注意:我正在使用 angularFire 的 $bind 来同步节点。

我不相信这是可能的,但我希望能够像这样设置我的规则:

{
  "rules": {
    "posts": {
      ".read": "auth.admin || $post.hasChild('restricted').val() !== true",
      "$post": {
      }
    }
  }
}

其他用户是如何做到这一点的?谢谢。

【问题讨论】:

    标签: security firebase rules angularfire


    【解决方案1】:

    您可以使用data.hasChild 表达式来实现:

    {
      "rules": {
        "posts": {
          ".read": "auth.admin || data.hasChild('restricted').val() !== true"
        }
      }
    }
    

    但是,这不是推荐的方法,在实践中也行不通。安全规则不适合根据访问权限过滤数据 - 您会在控制台中看到权限被拒绝错误,因为 angularFire 会尝试从 /blog 读取所有帖子,但它会失败。

    相反,每个用户都应该知道他们有权访问哪些帖子,并且只能直接获取这些帖子。您可以使用push()(或 angularFire 中的$add)生成随机帖子 ID 并设置安全规则,以便您可以在知道帖子 ID 的情况下访问数据。

    【讨论】:

    • 如果我使用您描述的第一种方法绑定到帖子,我只会获得用户有权访问的孩子,并为我无权访问的孩子收到一些拒绝访问的消息?除了凌乱的控制台还有什么问题?这似乎是最干净的方法。根据您的替代建议,我认为我必须维护一个替代结构来镜像我的数据,该结构允许完全读取访问并存储我所有数据的所有权限。这似乎为应该非常简单且非常常见的用例增加了复杂性。我错过了什么吗?
    • 您实际上根本不会收到任何孩子,即使有些孩子是可读的——同样——安全规则并不是为了过滤项目。
    【解决方案2】:

    我相信规范的做法是将规则直接放在要读取的元素上,而不是放在集合上。

    {
      "rules": {
        "posts": {
          "$post": {
            ".read": "auth.admin || data.hasChild('restricted').val() !== true"
          }
        }
      }
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2017-01-25
      • 2017-01-28
      • 1970-01-01
      • 2020-08-15
      相关资源
      最近更新 更多