FireBase - 如何列出用户特定的数据?

时间:2014-02-01 17:07:13

标签: javascript angularjs firebase firebase-security

目前我一直在关注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:客户端无权访问所需数据。

如果有人有解决方案,那就太棒了!

1 个答案:

答案 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