如果允許用戶根據用戶的電子郵件地址閱讀文檔本身的文檔,我想要存儲它。多個用戶應該可以訪問同一個文檔。根據the documentation Firestore不允許查詢數組成員。這就是爲什麼我要將用戶電子郵件地址存儲在String-Bool Map中,並將電子郵件地址作爲關鍵字。基於地圖值的Firestore安全規則
對於下面的示例,我不使用電子郵件作爲映射鍵,因爲它已經不適用於基本字符串。
數據庫結構看起來像這樣:
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
所有安全規則,這裏列出:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
編輯:它也不會,如果我使用match /lists/{listId}
的工作,而不是match /lists/{listId=**}
我的理解是,如果地圖shared[test]
中的值爲真,則此安全規則應允許讀取所有人。
對於completness緣故:這是我使用的查詢(科特林在Android):
collection.whereEqualTo("shared.test", true).get()
.addOnCompleteListener(activity, { task ->
if (task.isSuccessful) {
Log.i("FIRESTORE", "Query was successful")
} else {
Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
}
})
我猜,我不能從安全規則訪問映射值。那麼,對於我的問題,將有什麼替代方案?
在Firestore rules reference它寫道,地圖可以像那樣訪問resource.data.property == 'property'
所以,我做錯了什麼?
我對resource.data所看到的所有示例都沒有**通配符語法,所以如果您使用'match/lists/{listId}'而不是'match/lists/{listId = **}'?值得嘗試的東西。 – Scarygami
不,不幸的是,這也是行不通的 –
嗯......我會誠實的;這看起來像這應該工作正常。您是否可以首先仔細檢查一下,您是否意外存儲了數據/將規則編輯到實時數據庫而不是Cloud Firestore中? (它有時會發生)另外,如果您不做這個查詢並嘗試獲取單個文檔,會發生什麼? –