Firebaseアプリの保護されたコンテンツの適切な承認ルールへのベストプラクティスアプローチはありますか
これまでの私の研究のいくつか:
方法1:シークレットURL
ドキュメントを表示/編集できるようにするには、URLを知っている必要があります
そのURLにアクセスできるログインユーザーは、URLを編集/変更できるため、実際の認証ではありません。
アクセスできるすべてのドキュメントにインデックスを付けることはできません
方法2:Firebase認証ルールを使用してユーザーをドキュメントに追加し、ユーザーがdocument.usersであるかどうかを確認してから読み取り/書き込みを行います。
取得元: Firebaseで保護されたコンテンツは可能ですか?
{
"documents": {
"$documents_id": {
// any friend can read my post
".read": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
// any friend can edit my post
".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
},
users:{
// List of user.ids that have access to this document
}
}
}
長所:
短所:
方法3:Firebase認証ルール(方法2)に加えて、各ユーザーがアクセスできるdocument_idの配列を持つユーザーの冗長ストア。このユーザーストアは、ユーザーがアクセスできるすべてのドキュメントをクエリするためにのみ使用されます。すなわち:
{
"documents": {
"$documents_id": {
// any friend can read my post
".read": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
// any friend can edit my post
".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
}
},
"users":{
"$user":{
".read": "auth.id=$user.id",
".write": "auth.id=$user.id"
"$documents":{
// All the documents i have access to. This list gets ammended whenever I am granted/stripped access to a document.
}
}
}
}
長所:
短所:
方法4:グループ
グループごとの使用 ユーザーのグループにFirebaseの場所へのアクセスを許可する
データストア内のすべてのドキュメントにグループがあります
ユーザーがアクセスできるすべてのドキュメントについて、Firebaseに簡単にクエリを実行できません
これを行うためのより良い方法はありますか?
あなたはオプションを列挙するのに良い仕事をしました、そしてあなたは間違いなく正しい軌道に乗っています。ご存知のとおり、セキュリティルールに基づいてクエリを実行する方法はありません。これは意図的に行われたものです。これは(セキュリティルールによっては)非常に高額になる可能性があるためです(Firebaseはこの理由から、一般的に複雑なクエリを回避します)。
したがって、方法3はこれを行うための正確な正しい方法です。このような状況でデータを複製することは、実際には非常に一般的な方法です。これについて詳しく説明しているブログ投稿については、 データの非正規化は正常です を参照してください。
複製されたドキュメントリストを使用して方法1を実行することもできます。これは、URL(シークレットIDを含む)だけでドキュメントに誰かを「招待」できるようにする場合に特に便利です。または、2つを組み合わせて実行することもできます(一部のドキュメントは「公開されているが非公開」であり、一部は「招待された友達に非公開」などです)。