我的基本问题是如何设置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": {
}
}
}
}
其他用户如何完成此操作?感谢。
答案 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"
}
}
}
}