FireBase - 如何列出用户特定的数据?
Posted
技术标签:
【中文标题】FireBase - 如何列出用户特定的数据?【英文标题】:FireBase - how to list user-specific data? 【发布时间】:2014-02-25 09:07:12 【问题描述】:目前我一直在看FireBase,一直在使用AngularJS插件,发现下面这个问题我无法摆脱。
我目前已经实现了简单的登录系统。 注册后用我的邮箱和密码登录,我创建一个这样的帖子:
post =
name: "Hi",
message: "Guys",
user_id: Auth.user.id // for my current user this is 1
posts.$add(post)
从现在开始一切都很好。 现在我想做的是在firebase的posts/端点中,我只想显示当前登录用户的帖子。
其他用户可能能够通过拥有一个公共布尔变量来阅读其他人的帖子(但那是以后的事了)
我一直在研究 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 WARNING: on() or once() for /posts failed: Error: permission_denied: Client 没有访问所需数据的权限。
如果有人有解决方案,那就太棒了!
【问题讨论】:
【参考方案1】:安全规则不能用作数据过滤器。您不能只阅读整个帖子路径并期望只检索您被允许查看的记录。相反,您需要以一种可以读取整个路径的方式构建数据,或者存储可查看记录的索引并单独获取它们。
例如,按组 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
【讨论】:
您好,谢谢您的解释。它真的让一切都是透视的,除了原始文档之外,我真的需要这个。感谢您花时间从我的 POV 中解释这一点! 当然!您可能还想查看 denormalization 和 2 Part series on SQL Queries 上的 Firebase 博客作为进一步阅读:) 这正是我在阅读您的答案后去的地方! :) 顺便说一句,它现在真的很好用,我所做的是在 Firebase 中添加一个单独的帖子对象(就像我在问题中所做的那样)然后在我的用户对象中,我保留了该用户的帖子 ID 列表。这样,我仍然可以列出特定用户的帖子,同时还能保持所需的安全级别。 @Kato 我觉得你的回答很有帮助。帮助我理解一些东西。您提出的/posts/$user/data
的结构与这篇denormalization 文章中提出的结构不匹配对吧?
在哪里提出了哪种结构?有几个,我看不出有任何矛盾。以上是关于FireBase - 如何列出用户特定的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Firebase 数据库锁定给来自特定(电子邮件)域的任何用户?