使用资源恢复查询安全规则.data 返回 false


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')

在安卓客户端中,代码是

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()) {
....

规则本身不会筛选数据。相反,他们只是强制所有对数据的访问都经过授权。

如果您只想允许用户访问不到 24 小时的数据,则需要满足以下两项要求:

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

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

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

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

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

最新更新