2017-10-10 57 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

没有更新,但我知道团队正在积极研究它。 –