簡體   English   中英

Firestore - 公司內部用戶的安全規則

[英]Firestore - security rules for users within companies

我們目前的Firestore結構如下: 在此處輸入圖像描述

  • 目前我們沒有使用任何子集合
  • 用戶有他們所屬的公司列表
  • 每個項目只與1家公司有關
  • 項目屬於一個公司,當companyId字段寫的是那個公司的UID

我的第一個問題是我們如何指定該數據庫定義的安全規則? 有一些最佳實踐方法嗎?

我們的第一個想法是這樣做:

match /databases/{database}/documents/projects/{projectUid}/{document=**} {
allow read: if 
(/databases/$(database)/documents/projects/$(projectUid)/companyId) === 
(/databases/$(database)/documents/users/$(request.auth.uid)/companyId)
}

但根據文檔,這意味着我們每次讀取基本上有 3 次讀取(2 次安全查詢和 1 次從 DB 實際讀取)。 這似乎是在浪費查詢。

有比這更好的方法嗎? 我們正在考慮更改為子集合:

  • 最后,我們將在根集合中擁有“公司”和“用戶”(用於存儲所有用戶的詳細信息)
  • 項目將是公司的子集
  • 頁面將是項目的子集合
  • ...ETC
  • 並且公司將包含用戶列表(而不是像現在這樣反過來) - 但只是列表,而不是用戶詳細信息

這樣我們就可以使用與文檔中類似的方法,其中每個匹配項都包含 {companyId} 並且在 allow 語句中我們將使用類似

match /databases/{database}/documents/companies/{companyId}/projects/{projectId} {
    allow read: if
    exists(/databases/$(database)/documents/companies/$(companyId)/users/$(request.auth.uid));
}

感謝您提供有關如何以最可擴展且尤其是最安全的方式構建它的任何建議。

您是否考慮過將用戶的公司 ID 作為自定義聲明添加到他們的個人資料中 這樣您的安全規則中就不需要額外的讀取。

由於設置這些聲明需要 Admin SDK,因此需要您可以在某處運行受信任的代碼。 但是,如果您還沒有自己的可信環境,則可以為此使用 Cloud Functions,例如基於一些其他操作,例如寫入您當前的 Firestore 結構。

添加對弗蘭克的回答。

借用其他 API SDK(例如 Microsoft Graph),通常要發出資源請求,您首先使用代表用戶范圍/權限的身份驗證令牌初始化客戶端對象。 例如:

const client = new SDKClient(my_auth_token);

客戶端構造函數將對聲明進行令牌驗證步驟。 然后您可以進行 REST 調用,例如

const response = await client.someEndpoint({ method: 'POST', body: my_object });

我建議不要使用管理 SDK 讀取/寫入您的 firestore,而是使用常規的 firebase nodejs 客戶端。 要使用安全規則限制訪問,請使用您從請求標頭中獲取的令牌將 firebase JWT 令牌傳遞到此自定義SDKClient類中。 在構造函數中,初始化一個新的 firebase“應用程序”。 因為普通的 firebase 客戶端是
根據安全規則,這將滿足您的需求。 此答案中已經提供了一些示例代碼。

我應該補充一點,根據這個firebase 文檔,有一個使用 admin-sdk 服務器端的“警告”,但我不確定我明白為什么。

對於我們正在研究的類似事物,我想到了一種方法,即只有某些用戶可以訪問的私人聊天室,是使用服務器上的密鑰加密所有消息,並且只授予特定用戶對該密鑰的讀取權限用戶。 這樣額外的讀取只需要發生一次,就在第一次獲取密鑰時,然后沒有額外安全規則的正常讀取就可以了,因為攻擊者無法對它們做任何事情,因為它們是加密的他們無權訪問密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM