1

我對Firebase安全性感到困惑。這裏爲什麼...Firebase安全 - 共享數據

例如;我有以下數據庫:

clients: { 
    $key: { 
     //client data 
    } 
} 

trainer: { 
    $key: { 
     //trainer data 
    } 
} 

我需要一個客戶端才能夠看到他們自己的信息。我需要一名培訓師能夠看到所有客戶的信息,但不能看到其他培訓師的信息。

因此客戶端A,B和C可以看到他們的私人數據。但是訓練師A只能看到客戶A和B的細節(他不訓練C)。

我遇到的問題是,您似乎無法請求所有客戶端的示例,但只返回那些使用安全規則結帳的客戶端。正如文檔所述,如果列表中的某個返回false,那麼整個團隊都會這樣做。

如何創建正確的結構和安全規則?

回答

0

與Firebase文檔中的示例類似(https://firebase.google.com/docs/database/security/user-security),這可能適合您。

我認爲至少您的結構可以從客戶和培訓師之間的直接關鍵聯繫中受益。像

clients: { 
    clientA: { 
     trainerKey: "trainerA" 
    } 
} 

trainers: { 
    trainerA: { 
     clients: { clientA: true, clientB: true } 
    } 
} 

安全規則的東西 - 編輯成包括用戶

"clients": { 
    ".read": "auth !== null && (root.child('trainers/' + $trainerKey + '/clients').child($uid).exists() || auth.uid == $uid") 
} 

此一)檢查用戶進行身份驗證和b)查看是否客戶端是客戶的名單培訓師或者這是否是客戶。

這是未經測試的,但希望能讓你想要去的地方。我還假設你的客戶ID與他們的身份驗證ID相同。

+0

感謝您的建議。我嘗試了幾乎與此相同的東西,但會放棄它。如果有一位客戶是'trainerA'沒有的話,這肯定會失敗嗎?如果規則在任何支票上返回false,則整個結果爲零,對不對? –

+0

是的,它應該。這是未經測試的,因此您的情況可能無法在當前狀態下運行。這就是說,至少應該讓你在概念上接近你所需要的東西。 – dstepan

+0

我很欣賞這個想法。我怎麼可能在'clients'上請求所有數據,並且它只是返回那些通過安全性的數據呢? –

0

你應該像添加客戶端到培訓師的朋友一樣。創建一個包含培訓師的共享節點作爲孩子,培訓師將包含A客戶端密鑰及其數據。

+0

感謝您的迴應。這不會以很多重複的數據結束嗎? –

+0

複製數據將是一種簡單的方法,這也是Firebase工程師所建議的。你應該看看firebase提供的示例聊天應用程序的json文件。複製保持數據非規範化,而不是將大量數據保存在單個節點內,這需要花時間加載並且會影響應用程序的實時性能 –