2016-04-28 105 views
0

我想創建一個有很多用戶數據的應用程序。假設每個用戶都跟蹤他們自己的每個任務的時間。如果我將它平放它看起來像這樣:存儲用戶數據Flattenned安全

{ 
    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它說(接近尾聲)「...直到我們進入成千上萬的記錄...」,然後沒有解釋如何處理。

所以我的問題如下。我知道我們無法通過安全進行篩選,但是我可以使用安全性限制用戶訪問的內容,然後在搜索時將其從用戶標識中刪除?然後我的結構會變成這樣:

{ 
    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()" 
    } 
} 

有了這個每個用戶只能讀取自己的任務。

但有了這些規則,您的查詢將無法正常工作。在它的最核心的查詢從tasks這裏閱讀:

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

而且,由於用戶不具有讀取權限tasks該讀操作失敗。

如果您要爲用戶提供tasks的讀取權限,則讀取和查詢可以正常工作,但用戶還可以讀取您不希望授予其訪問權限的所有任務。

+0

這就是我害怕的!有沒有解決的辦法?你有關於如何構建數據的建議嗎?我能想到的唯一事情就是隱藏每個用戶的所有內容。附:感謝您的快速響應:) –

+1

您的初始數據結構爲每個用戶列出了他們有權訪問的任務的索引。因此,你不需要查詢,你可以'ref.child('users')。child(authData.uid).child('tasks')。on(...'。 –

+0

對,但是我怎麼做得到所有的任務數據?這將讓我知道什麼是正確的ID? –