0

多くのユーザーデータを持つアプリケーションを作成したいと考えています。各ユーザーがタスクごとに独自の時間を追跡しているとします。これを格納すると、次のようになります。ユーザーデータの格納フラットセキュリティー

{ 
    users: { 
     USER_ID_1: { 
      name: 'Mat', 
      tasks: { 
       TASK_ID_1: true, 
       TASK_ID_2: true, 
       ... 
      } 
     }, 
    }, 
    tasks: { 
     TASK_ID_1: { 
      start: 0, 
      end: 1 
     }, 
     TASK_ID_2: { 
      start: 1, 
      end: 2 
     } 
    } 
} 

これで、ユーザーのすべてのタスク情報を照会して取得したいと思います。現在、データは小さいです。彼らのガイドから:https://www.firebase.com/docs/web/guide/structuring-data.htmlそれは(終わり近くに) "...数万のレコードに入るまで..."と言い、それをどう扱うか説明していない。

私の質問は次のとおりです。私はセキュリティでフィルタリングを行うことはできませんが、セキュリティを使って人々のアクセス権を制限し、検索する際にユーザーIDからそれを外すことはできますか?私の構造は、これに回します:

{ 
    users: { 
     USER_ID_1: { 
      name: 'Mat' 
     } 
    }, 
    tasks: { 
     TASK_ID_1: { 
      user: USER_ID_1, 
      start: 0, 
      end: 1 
     }, 
     TASK_ID_2: { 
      user: USER_ID_1, 
      start: 1, 
      end: 2 
     }, 
     ... 
    } 
} 

その後、私は、各タスクは、それを作成したユーザーがアクセスすることを可能にするだけに私のセキュリティルールを設定するだろう、と私の参照クエリは次のようになります。

var ref = new Firebase("https://MY_FIREBASE.firebaseio.com/"); 

$scope.tasks = $firebaseArray(ref.child('tasks/') 
    .orderByChild('user') 
    .startAt('USER_ID_1') 
    .endAt('USER_ID_1')); 

私はそれをどう構造化すべきですか?私のクエリは機能しますが、一人のユーザーが別のユーザーのタスクを見ることができない場所にセキュリティを導入すると、動作するかどうかはわかりません。

答えて

2

セキュリティルールを使用してデータをフィルタリングすることはできません。創造的なデータモデリングでさえそれを変えることはできません。唯一、自分のタスクを読むことができます。これにより

"tasks": { 
    "$taskid": { 
    ".read": "auth.uid === data.child(user).val()" 
    } 
} 

各ユーザー::-)

は正しくタスクへのセキュアなアクセスは、あなたのような何かをする必要がありますするには。

しかし、これらのルールでは、クエリは機能しません。

ref.child('tasks/')...some-filtering...on(... 

をそして、あなたのユーザーは、この読み取り操作が失敗したtasksの読み込み許可を持っていないので、:それはあなたのクエリがここtasksから読んでいるほとんどのコアのでは。

ユーザーにtasksの読み取り権限を与えると、読み取りとクエリは機能しますが、ユーザーはアクセスを許可したくないすべてのタスクも読み取ることができます。

+0

これは私が恐れていたことです!これを回避する方法はありますか?データをどのように構造化できるかについての推奨事項はありますか?私が考えることができるのは、各ユーザーの下にすべて隠すことだけです。 p.s.迅速な応答ありがとう:) –

+1

最初のデータ構造には、アクセス権を持つタスクを列挙する各ユーザーのインデックスがあります。あなたはクエリを必要としないので、単にref.child( 'users')することができます。child(authData.uid).child( 'tasks')。on(... '。 –

+0

すべてのタスクデータを取得しますか?それでは、IDが何であるかを教えてください。 –

関連する問題