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()) {
....
答案 0 :(得分:0)
规则本身不会过滤数据。取而代之的是,他们只是强制要求所有对数据的访问均得到授权。
如果您只允许用户访问少于24小时的数据,则需要做两件事:
现在,您似乎只有规则,并且那些规则正确拒绝了您的代码发送的查询,因为该查询正尝试读取所有数据。
您需要向查询添加条件,以仅请求规则允许的数据。像这样:
mUsersDatabase
.orderBy("online", Query.Direction.DESCENDING)
.where("online", "<", new Date(System.currentTimeMillis() - (24 * 60 * 60 * 1000))
.limit(10)
您可能需要稍微调整偏移量,以防止客户端和服务器之间的微小偏移量导致规则不必要的拒绝。