具有resource.data的Firestore查询安全规则返回false

时间:2020-05-21 10:50:43

标签: android firebase google-cloud-firestore firebase-security

match /User/{uid} {
            allow get : if request.auth.uid != null;
            allow list: if request.auth.uid != null  
            && ( request.time - resource.data.online ) < duration.value(24, 'h') &&
            request.query.limit <= 40 && request.query.orderBy['online'] == 'DESC'   ;

}

这是查询用户列表的规则,条件是只需要列出从现在起少于24小时的在线字段的用户文档。收集的用户数据在不到24小时的时间内都处于在线状态。但是当使用get()方法从firebase-android-sdk查询时,它返回false。当删除以下条件时,它可以工作,但我对此感到困惑。

( request.time - resource.data.online ) < duration.value(24, 'h')

我也尝试使用duration.abs(request.time - resource.data.online ) < duration.value(24, 'h')

在Android客户端中,代码为

mQuery = mUsersDatabase.orderBy("online", Query.Direction.DESCENDING).limit(10);
mQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                   ....


1 个答案:

答案 0 :(得分:0)

规则本身不会过滤数据。取而代之的是,他们只是强制要求所有对数据的访问均得到授权。

如果您只允许用户访问少于24小时的数据,则需要做两件事:

  1. 仅读取少于24小时的数据的查询。
  2. 允许该查询并拒绝其他列表操作的安全规则。

现在,您似乎只有规则,并且那些规则正确拒绝了您的代码发送的查询,因为该查询正尝试读取所有数据。

您需要向查询添加条件,以仅请求规则允许的数据。像这样:

mUsersDatabase
  .orderBy("online", Query.Direction.DESCENDING)
  .where("online", "<", new Date(System.currentTimeMillis() - (24 * 60 * 60 * 1000))
  .limit(10)

您可能需要稍微调整偏移量,以防止客户端和服务器之间的微小偏移量导致规则不必要的拒绝。