Pet*_*sen 16 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)
Run Code Online (Sandbox Code Playgroud)
从这一点开始,一切都很好.现在我想要做的是在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)"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它工作到一定程度,我只能在我登录时写帖子,但我无法阅读任何帖子!
posts = new Firebase(base + '/posts')
posts = $firebase(posts)
Run Code Online (Sandbox Code Playgroud)
错误是:FIREBASE警告:on /)或一次()/ posts失败:错误:permission_denied:客户端无权访问所需数据.
如果有人有解决方案,那就太棒了!
Kat*_*ato 20
安全规则不能用作数据过滤器.您不能只读取整个帖子路径,并且只能检索您允许查看的记录.相反,您需要以可以读取整个路径的方式构建数据,或者存储可查看哪些记录的索引并单独获取它们.
例如,按组ID或用户ID存储记录:
/posts/$group/data...
/posts/$user/data...
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过将用户分配给适当的组来确保您的用户具有权限,并且只需获取这些组的消息:
var ref = new Firebase(base + '/posts/' + GROUP_ID);
var posts = $firebaseArray(ref);
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建每个用户/组/等可以查看的消息索引:
/posts/$post_id/data...
/posts_i_can_view/$user_id/$post_id/true
Run Code Online (Sandbox Code Playgroud)
并从主列表中单独获取它们.像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);
Run Code Online (Sandbox Code Playgroud)
进一步阅读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 /博客/ 2013年4月12日,反规范化,是-normal.html
| 归档时间: |
|
| 查看次数: |
8479 次 |
| 最近记录: |