Firebase セキュリティが思い通りに機能することに頭を悩ませています。私のアプリは Ember でビルドされているので、EmberFire でビルドされています。したがって、構造は EmberFire によって決定されます。
私のデータベース構造は次のとおりです。
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)"
}
hasChild に auth.uid を渡すことができないようです。私の会話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 のトップ ボトム ルールにより、すべてのユーザーがすべての会話を見ることができます。
編集: 2 番目のルールには、最初のルールと同じ問題があります。beginWith() には文字列引数が必要です。そして auth.uid は使用できません 私の問題を解決するためのアイデアはありますか?
編集 : ルールの前に auth !== null を追加すると、エラー startsWith() が文字列引数を期待するようになります。しかし、両方のルールはまだ機能しません。