【发布时间】:2018-10-01 16:36:35
【问题描述】:
在 Firestore 安全规则中,是否可以在使用 list 查询时检查某些文档字段?
使用 Angular,我想使用其 username 属性从 userprofiles 集合中检索单个文档,如下所示:
let userprofile = this.afs.collection( 'userprofiles', ref =>
ref.where('username', '==', username ).limit(1);
如果满足以下任一条件,我希望 Firestore 安全规则允许此查询:
- 用户配置文件已发布,或
- 用户配置文件未发布,但相应用户已登录
这是我的 Firestore 安全规则:
match /userprofiles/{userprofileId} {
allow list: if( resource.data.published==true || (
resource.data.published==false &&
resource.data.uid==request.auth.uid )
);
}
}
对于上下文,我使用完全相同的规则来允许 get 请求,这很好。但是,上面示例中的查询会导致list 请求,而不是get。在这种情况下,这些规则不允许查询。我收到Error: Missing or insufficient permissions.
我记得读过类似列表查询的内容,规则必须允许所有文档或不允许文档,在我的情况下不适用。所以我有点理解为什么它不起作用。
我的问题是,我可以更改一些内容以使其适用于我的查询吗?或者这是不可能的?任何解决方法的想法? (除了明显的“按文档ID查询”或“使用户名成为文档ID”)
【问题讨论】:
-
您解决了这个问题吗?我遇到了一种情况,我可以直接通过 id 获取文档,但是当我执行 where 查询来检查 id == MYID (这是一个有一个结果的列表)时,它会因为权限被拒绝而失败。
标签: angular firebase google-cloud-firestore firebase-security