2016-06-17 11 views
1

私はgroceryItemアプリケーションを使っています。ユーザーはアイテムを追加できます。自分のアイテムだけを表示する必要があります。
childByAutoIdを使用してアイテムを追加し、各アイテムに固有のキーエントリを取得します(画像#1を参照)。 enter image description hereFirebaseデータベースのルールプライベートノード

各項目のHASTは3つの特性を得ました。 addedByUserは、認証されたユーザーのUIDです。もちろん、名前と数量です。

私は、ユーザーが独自の項目を見ることができるようにルールを設定する問題を抱えています。私の現在のルールはこのように見えます(写真#2を参照)。 enter image description here

他のユーザーとログインすると、すべてのアイテムを読むことができます。だから私の質問は: どのように私はそれらを作成したユーザーのための読み取り可能なアイテムを作ることができますか?

itemsaddedByUserの間には、私にはchildByAutoIdがあるので、隙間があると思います。あなたがもっと良い方法でこれを構造化する方法やヒントがあれば、plsは私を助けてくれます。

ありがとうございます!それは項目の「ネストされた子」が、子アイテムの属性ではありませんよう

+0

私は最初の失敗が見つかりました。 「.readと.writeのルールはトップダウンで動作し、より浅いルールはより深いルールをオーバーライドします」はhttps://firebase.googleで説明されています。(スナップショット) var newItems = [Item]() snapshot.childrenの項目には、次のものがあります。com/docs/database/security/securing-data#read_and_write_rules_cascade –

答えて

1

$ addedByUserは、この例では、間違った場所にある可能性があります。これはFirebase docsから持ち上げられる

"items": { 
    "$item": { 
    ".read": "data.child('addedByUser').val() === auth.uid" 
    } 
} 

:私はあなたの線に沿って何かを探しているだろうと(これをテストしたではない)ことをお勧め

データで:

{ 
    "messages": { 
    "message0": { 
     "content": "Hello", 
     "timestamp": 1405704370369 
    }, 
    "message1": { 
     "content": "Goodbye", 
     "timestamp": 1405704395231 
    }, 
    ... 
    } 
} 

ルールは、次のようになります。

} }

これは間違ったユーザーが他の人の(単数の)アイテムを読むのを防ぎ、あなたの例ではユーザーSZ825V ...が "items/-KKTDD ..."の読み取りを実行しないようにしますが、ユーザーSZ825V 「アイテム」の読み込みを実行するには、ユーザーが自分のドキュメントや他の人のドキュメントを読み込もうとしているため、読み込みが完全に失敗します。これはルールが原子的に振る舞うfirebaseの重要な概念です。つまり、読み取りの一部が失敗した場合、読み取り全体が失敗します。これを置く別の方法は、ルールがフィルタとして機能しないということです。 これが探している機能の場合は、構造を並べ替える必要があります。

{ 
    "users": { 
    "abcdef-user-id": { 
     "items": { 
     "fjeiwofjewio": { 
      "name": "apple", 
      "qty": "23" 
     } 
     } 
    }, 
    "ghijkl-user-id": { 
     "items": { 
     "regrewgreh": { 
      "name": "passionfruit", 
      "qty": "18" 
     } 
     } 
    } 
} 

とセキュリティルールは次のようになります。次のように例が考えられ

.. { 
    "users": { 
     "$userId": { 
      ".read": "auth.uid === $userId" 
     } 
    } 
    } 

上記のアプローチは、あなただけの、ユーザー独自のデータツリー内の項目を読み取るために、ユーザーをできるようにしたいと仮定しています誰も他のユーザーのアイテムを見ることはできないだろう。他のユーザーに他のユーザーのアイテムの一部を表示させたい場合は、もう一度別の方法を実行する必要があります。これは別の問題です。

+0

ref.child( "items")。 { プリント(アイテム) LET項目=項目(スナップショット:!FIRDataSnapshotなどの項目) newItems.append(アイテム) }私のiOSアプリイムで はこのREFにobserveEvent呼び出す 今私は何を読ん傾ける:( –

+0

。これは、firebase権限の原子的性質のためです。あなたが "items"リストを読み込み、読み込みに失敗した場合(つまり、別のユーザに属するアイテムを読み込もうとしているため)、読み込み全体が失敗し、いいえもの。ルールはフィルタとして機能しません。私の答えは、ユーザのアイテムを読むことができ、アイテムのリスト全体を読むことを試みるのではなく、他のユーザが読むことを妨げることに関する。異なる構造が適切かもしれませんが、私は答えに追加します。 – richter