2016-06-25 9 views
4

省略した構成Firebaseリアルタイムデータベースルール(すべては所有者だけを読みますが、編集することができます)

{ 
    "rules": { 
    "items": { 
     ".read" : true, 
     "$uid": { 
     ".read" : true, 
     ".write": "auth != null && auth.uid == $uid" 
     } 
    } 
    } 
} 

検証および他のディレクトリを支配します。 /アイテム/ USER1/ITEM1 /アイテム/ user2の/ ITEM1

すべて読むことができるアイテムのディレクトリとすべてのユーザーのアイテム(無プライベート項目)私は必要ない何

プロパティ

としてuserIdを持つアイテム

"items" : { 
    "item1": {}, 
    "item2": {} 
} 

のフラット配列

"item1" : { 
    "uid": "userId" 
} 

ユーザーのみ作成したアイテムは、それを削除/編集することができますが、すべてはそれを見ることができます。

私は、このような

"public_items": { 
     "item1": {}, 
     "item2": {} 
} 


"items": { 
    "userId": { 
     "item1": {}, 
     "item2": {}, 
    } 
} 

として別のディレクトリにある二重の項目を考えていた。しかし、それはない良いアイデアのように思えます。

ルールはアトミックに適用されます。つまり、その場所にルール がない場合、またはアクセスを許可する親ロケーションにルールがない場合、読み取りまたは書き込みの 操作はすぐに失敗します。影響を受けるすべての 子パスがアクセス可能な場合でも、親ロケーションでの読み取りは完全に失敗します 。 https://firebase.google.com/docs/database/security/securing-data#read_and_write_rules_cascade

ルールを各アイテムに適用できない場合、別のオーナーとアイテムディレクトリを作成する方法はありますか。

答えて

4

これは、/items/itemId/uidを使用してのみ処理できます。

{ 
    "rules": { 
    "items": { 
     ".read" : true, 
     "$itemId": { 
      ".write": "(!data.exists() && newData.child('uid').val() == auth.uid) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)" 
     } 
    } 
    } 
} 

上記のルールが考えられます。我々は誰もがitemsの中にあるすべてを読むことを許可しています。ただし、アイテムを所有しているユーザー(/itemId/uid)のみが作成/編集できます。また、新規または編集したアイテムにユーザーIDがあることを強制しています。

関連する問題