目前,我一直在研究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警告:/ posts的on()或一次()失败:错误:Permission_denied:客户端没有访问所需数据的权限。
如果有人有解决方案,那就太好了!
安全规则不能用作数据过滤器。您不仅可以阅读整个帖子的路径,而且希望仅检索允许查看的记录。取而代之的是,您需要以一种可以读取整个路径的方式来构造数据,或者存储可以查看并分别获取它们的记录的索引。
例如,按组标识或用户标识存储记录:
/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