我有一個包含三個集合的 firestore 資料庫模式:
users
- name: string
brokers
- name: string
- members: array of User references
companies
- name: string
- brokers: array of Broker references
另外:users表的 id 與 firebase 身份驗證中的 UID 相同。
我希望companies只有作為相關代理成員的用戶才能讀取該表。安全規則應該是什么?
例如,假設我想讀取具有以下查詢和資料的公司,user1應該能夠做到但不能user2:
// Query:
const company = db.collection('companies').doc('company1').get()
// Data:
"users": {
"user1": {
"name": "Elon Musk"
},
"user2": {
"name": "Jeff Bezos"
}
}
"brokers": {
"broker1": {
"name": "Broker 1",
"members": [
"users/user1"
]
}
}
"companies": {
"company1": {
"name": "SpaceX",
"brokers": [
"brokers/broker1"
]
}
}
我已經嘗試過了,但它只有在公司鏈接到一個經紀人而不是一組經紀人時才有效:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function getUser() {
return /databases/$(database)/documents/users/$(request.auth.uid)
}
function userIsMember(resource) {
return "members" in resource.data && getUser() in resource.data.members
}
match /companies/{companyId} {
function getBroker() {
return get(/databases/$(database)/documents/brokers/$(resource.data.broker.id))
}
allow read: if userIsMember(getBroker());
}
}
}
uj5u.com熱心網友回復:
安全規則本身不會過濾資料,而只是確保您的代碼遵循您為它們設定的規則。因此,如果您的規則規定用戶只能閱讀他們所屬的檔案,則查詢應該只請求他們所屬的檔案。這是一個常見的誤解,檔案部分中涵蓋了rules are not filters。
不過,您似乎無法將getBroker規則轉換為查詢,因為無法對不屬于查詢結果的資料設定條件。
順便說一句,這兩個限制的存在是出于相同的原因:由于您需要為每個閱讀的檔案付費,如果 Firestore 必須檢查每個潛在檔案以查找您的規則/查詢,事情會很快變得昂貴。
解決方案通常是將必要的資料復制到每個公司檔案中,盡管您必須確定這是否適用于您的用例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441449.html
標籤:火力基地 谷歌云火库 firebase-安全
