【问题标题】:Firestore Query Security Rules with resource.data returns false带有 resource.data 的 Firestore 查询安全规则返回 false
【发布时间】:2020-09-07 23:35:59
【问题描述】:
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 ) &lt; 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()) {
                   ....


【问题讨论】:

  • 您能否编辑您的问题以同时显示执行查询的代码?
  • 对我来说似乎是正确的,也许resource.data.online 是错误的类型?还要检查this Medium post,因为它还有一些其他示例,它们在比较之前将时间转换为毫秒(尽管这不是必需的)。
  • @FrankvanPuffelen 我已经添加了执行查询的android客户端
  • @Ajordat 在 Medium 帖子本身中,有 Responses 表明它无法正常工作

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


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我试过了,查询甚至返回 false,因为下面的日志显示。我在 android-sdk 中使用 whereGreaterThan( ) Listen for Query(target=Query(User where online > # com.google.firestore.v1.Value@f8de0f10 integer_value: 0 timestamp_value { nanos: 900000000 seconds: 1590258878 } order by -online, -name);limitType=LIMIT_TO_FIRST) 失败:Status{code=PERMISSION_DENIED, description=Missing or enough permissions., cause=null}
  • 是否有任何其他方法可以限制对客户端的查询,因为我的目标是通过限制他们访问在线用户列表来防止查询数据库中的所有用户数据> 这次 - 24小时
  • 在进行@FrankvanPuffelen 的查询时,您是否删除了有关时间的规则? where 条件应该涵盖时间过滤。
  • @Ajordat 我没有删除与上面相同的规则
  • 然后删除 Firesbase 规则中的时间条件并执行 Frank 提供的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2020-10-18
  • 2021-01-10
相关资源
最近更新 更多