目前我一直在关注FireBase,并且一直在使用AngularJS插件,并且发现了以下我无法解决的问题。
我目前已经实现了简单的登录系统。 注册后用我的邮箱和密码登录,我创建了一个这样的帖子:
post = {
name: "Hi",
message: "Guys",
user_id: Auth.user.id // for my current user this is 1
}
posts.$add(post)
从这一点开始,一切都很好。 现在我想做的是在firebase上的posts / endpoint中,我只想显示当前登录用户的帖子。
其他用户可以通过使用公共布尔变量来阅读其他用户的帖子(但以后就是这样)
我一直在关注Firebase的安全API(请参阅:https://www.firebase.com/docs/security/security-rules.html) 目前我有这个:
{
"rules": {
"posts": {
"$post": {
".read": "data.child('user_id').val() == auth.id",
".write": "(data.child('user_id').val() == auth.id) || (newData.child('user_id').val() == auth.id)"
}
}
}
}
它的作用在一定程度上,我只有在登录后才可以写帖子,但我无法阅读任何帖子!
posts = new Firebase(base + '/posts')
posts = $firebase(posts)
错误是:FIREBASE警告:on /)或一次()/ posts失败:错误:permission_denied:客户端无权访问所需数据。
如果有人有解决方案,那就太棒了!
答案 0 :(得分:20)
安全规则不能用作数据过滤器。您不能只读取整个帖子路径,并且只能检索您允许查看的记录。相反,您需要以可以读取整个路径的方式构建数据,或者存储可以查看哪些记录的索引并单独获取它们。
例如,按组ID或用户ID存储记录:
/posts/$group/data...
/posts/$user/data...
然后,您可以通过将用户分配到适当的组来确保您的用户具有权限,并且只需为这些组提取消息:
var ref = new Firebase(base + '/posts/' + GROUP_ID);
var posts = $firebaseArray(ref);
或者您可以创建每个用户/组/等可以查看的消息索引:
/posts/$post_id/data...
/posts_i_can_view/$user_id/$post_id/true
从主列表中单独获取它们。像Firebase-util这样的工具可以使这更加简单:
var fb = new Firebase(base);
var ref = Firebase.util.NormalizedCollection(
fb.child('posts_i_can_view/'+USER_ID),
fb.child('posts')
)
.select('posts.message', 'posts.user_id')
.ref();
var posts = $firebaseArray(ref);
进一步阅读Firebase数据结构:
https://www.firebase.com/docs/web/guide/structuring-data.html https://www.firebase.com/docs/web/guide/understanding-data.html https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html