如何使用 EmberFire 保护我的 Firebase 应用构建
How to secure my Firebase App build with EmberFire
我为 Firebase 的安全性如我所愿而挠头。
我的应用程序是使用 Ember 构建的,因此使用 EmberFire。所以结构是由Ember火决定的。
我的数据库结构如下:
conversations : {
$conversation_id {
messages {
//message data
}
users {
$user_id1 :true
$user_id2 :true
}
}
}
我想要的是只有参与对话的用户才能在此对话中查看和写入消息。我尝试了这条规则但没有成功:
"conversations" : {
".indexOn" : "notify",
".read" : "auth !== null && root.child('users').hasChild(auth.uid)",
".write": "auth !== null && root.child('users').hasChild(auth.uid)"
}
好像auth.uid不能传给hasChild。我还尝试了以下方法,因为我的对话 ID 是参与对话的用户 ID 的加入:
"conversations" : {
".indexOn" : "notify",
"$conversation" : {
".read" : "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))",
".write": "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))"
}
}
使用此规则,没有人可以看到对话,因为 "conversations" 节点没有 .read 规则。但是,如果我将“.read : true”添加到 "conversations" 节点,由于 Firebase 中的自上而下规则,所有用户都可以看到所有对话。
编辑:第二条规则与第一条有同样的问题。 beginsWith() 需要一个字符串参数。而且auth.uid不能用
有解决我问题的想法吗?
编辑:在规则前添加 auth !== null ,使错误 beginsWith() 期望字符串参数消失。但是这两个规则仍然不起作用。
您第一次尝试的问题是您使用的是 root,但本应使用 $conversation。 Root 是引用 firebase 根目录的规则快照,而 $conversation 是一个变量,其中包含您尝试 read/write.
的对话 ID
"conversations" : {
".indexOn" : "notify",
"$conversation" : {
".read" : "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)",
".write": "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)"
}
}
我为 Firebase 的安全性如我所愿而挠头。 我的应用程序是使用 Ember 构建的,因此使用 EmberFire。所以结构是由Ember火决定的。
我的数据库结构如下:
conversations : {
$conversation_id {
messages {
//message data
}
users {
$user_id1 :true
$user_id2 :true
}
}
}
我想要的是只有参与对话的用户才能在此对话中查看和写入消息。我尝试了这条规则但没有成功:
"conversations" : {
".indexOn" : "notify",
".read" : "auth !== null && root.child('users').hasChild(auth.uid)",
".write": "auth !== null && root.child('users').hasChild(auth.uid)"
}
好像auth.uid不能传给hasChild。我还尝试了以下方法,因为我的对话 ID 是参与对话的用户 ID 的加入:
"conversations" : {
".indexOn" : "notify",
"$conversation" : {
".read" : "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))",
".write": "auth !== null && ($conversation.beginsWith(auth.uid) || $conversation.endsWith(auth.uid))"
}
}
使用此规则,没有人可以看到对话,因为 "conversations" 节点没有 .read 规则。但是,如果我将“.read : true”添加到 "conversations" 节点,由于 Firebase 中的自上而下规则,所有用户都可以看到所有对话。
编辑:第二条规则与第一条有同样的问题。 beginsWith() 需要一个字符串参数。而且auth.uid不能用 有解决我问题的想法吗?
编辑:在规则前添加 auth !== null ,使错误 beginsWith() 期望字符串参数消失。但是这两个规则仍然不起作用。
您第一次尝试的问题是您使用的是 root,但本应使用 $conversation。 Root 是引用 firebase 根目录的规则快照,而 $conversation 是一个变量,其中包含您尝试 read/write.
的对话 ID"conversations" : {
".indexOn" : "notify",
"$conversation" : {
".read" : "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)",
".write": "auth !== null && root.child('conversations/'+$conversation+'/users').hasChild(auth.uid)"
}
}