私はで開始することを理解することは非常に困難でしたが、ルールは非常に柔軟で、あなたに他のデータベースの内容に基づいてデータへの基本アクセスをしましょう。基本的には、ノードへのアクセスを許可し、その許可はすべての子にも適用され、ツリーの深いノードからは削除できません。これらのデータベースルールはコンソールに適用できますが、データベース全体のルールを設定する場合にも同様にAPIを使用する必要があります。それらは単一のドキュメントでなければならないので、ユーザーをハードコーディングする必要はありませんが、隠れたアクセスできないノードに配置するとルールにアクセスできます。
たとえば、人が他の人と友だちになるように要求し、他の人が両方の人を受け入れて友だちリストに追加できるようにしたいとしましょう。最初のステップは、friendRequests/$targetUid/$requestorUid
に値を書き込んで
uid
"friends"
friendUid1
friendUid2
friendUid3
"private"
... some private data your friends can read
"friendRequests"
targetUid
requestorUid -> can be written to only by requestorUid
:あなたは、これに似たスキーマを持つことができます。このノードに書き込むことができるのは、requestorUidとして認証された人だけです。 targetUidはtargetUidノードへの読み取りアクセスを許可されるため、子であるため読み込めますが、書き込みはできません。
friendRequests/targetUid/requestorUid
の存在に基づいて、$requestor/friends/$targetUid
への書き込みアクセスを$ targetUidに許可することができます。これにより、フレンドリクエストを受け取った人は、リクエスタが自分のフレンドリストに自分のUIDを書き込むことができます。次に、リクエスターのuidを自分のフレンドリストに書き込みます。ログインしているユーザーのuidがフレンドリストにある場合、ユーザーはプライベートデータにアクセスできます。 auth.uidが一致しますので
{
"rules": {
"$uid": {
".read": "auth.uid === $uid",
".write": "auth.uid === $uid",
"friends": {
"$friendId": {
".write": "root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId"
}
},
"private": {
".read": "data.parent().child('friends').child(auth.uid).exists()"
}
},
"friendRequests": {
"$targetUid": {
".read": "auth.uid === $targetUid",
"$requestorUid": {
".write": "auth.uid === $requestorUid"
}
}
}
}
}
のは、いくつかの「本物」のIDを使用し、100 uidは彼らは200の要求であることを自分自身のID 100を記述したuid 200と友達になりたいとしましょう、これは許可され
ref = db.getReference("friendRequests/200/100");
ref.setValue(true);
することで200ログインしたユーザIDが、彼らはfriendRequests/200
ですべての友達リクエストを読むことができます:$ requestorUidとは、最後の書き込みルールに一致します。彼らは、ユーザー100が友人であることを要求したことを知っているので、最初にusers/200/friends
に100を追加します。これは、auth.uidが200になり、users/200
ノード全体とそのすべての子ノードに対して完全な読み取り/書き込みアクセス権を持つために許可されます。
"root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId"
auth.uid
200になり、チェックがfriendRequests/200/100
が存在し、そのノードがユーザーによってのみ書き込み可能であるため、100は200と友達になることを求められていることがわかります。このルールがあるため
次は、彼らはまた、users/100/friends/200
に書き込むことができます100。
Firebaseデータベースのセキュリティモデルについては、こちらのドキュメント(https://firebase.google.com/docs/database/security/)で説明しています。これはFirebaseサーバで実行されるため、iOSクライアントに固有のものではありません。ドキュメンテーションを勉強し、ユースケースに適したものにして、ルールの実装に問題がある場合はここに戻ってみることをお勧めします。 –