2017-10-10 81 views
9

如果允許用戶根據用戶的電子郵件地址閱讀文檔本身的文檔,我想要存儲它。多個用戶應該可以訪問同一個文檔。根據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'所以,我做錯了什麼?

+0

我對resource.data所看到的所有示例都沒有**通配符語法,所以如果您使用'match/lists/{listId}'而不是'match/lists/{listId = **}'?值得嘗試的東西。 – Scarygami

+0

不,不幸的是,這也是行不通的 –

+0

嗯......我會誠實的;這看起來像這應該工作正常。您是否可以首先仔細檢查一下,您是否意外存儲了數據/將規則編輯到實時數據庫而不是Cloud Firestore中? (它有時會發生)另外,如果您不做這個查詢並嘗試獲取單個文檔,會發生什麼? –

回答

9

編輯:此問題現在應該修復。如果您仍然看到它(並確定它是規則評估程序的錯誤),請在評論中告訴我。

我在這裏和一些人聊過,關於你遇到的問題,這似乎是安全規則本身的一個問題。從本質上講,問題似乎是特定於評估查詢中的嵌套字段,比如你正在做什麼。

所以,基本上,你在做什麼應該可以正常工作,並且你需要等待來自Firestore團隊的更新才能使這個查詢正常工作。我會盡量記住在發生這種情況時更新此答案。對不起'回合!

+0

有沒有這方面的更新或地方檢查自己?我也被這個問題所阻擋,沒有很好的解決方法(缺少重構數據)我們仍然掛着 –

+2

沒有更新,但我知道團隊正在積極研究它。 –