如何使用Firebase规则仅授予某些叶节点的权限

时间:2014-01-10 08:04:48

标签: security firebase rules angularfire

我的基本问题是如何设置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": {
      }
    }
  }
}

其他用户如何完成此操作?感谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

我认为这样做的规范方法是将规则直接放在要读取的元素上,而不是放在集合上。

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