通过安全规则中的某个子值限制查询

2023-12-03

我正在努力想出构建部分数据库及其相关安全规则的最佳方法。

我有聊天组,并且可以随时将用户添加到这些组中。当用户添加到组中时,他们应该只能检索发送的消息after那。他们不应该检索在他们(用户)添加到组之前发送的任何消息。

我的第一种方法错误地假设安全规则仅适用于正在查询的数据。

简化这个问题,我有以下结构:

{
    "groups": {
        "-Kb9fw20GqapLm_b8JNE": {
            "name": "Cool people"
        }
    },
    "groupUsers": {
        "-Kb9fw20GqapLm_b8JNE": {
            "3JzxHLv4b6TcUBvFL64Tyt8dTXJ2": {
                "timeAdded": 1230779183745
            },
            "S2GMKFPOhVhzZL7q4xAVFIHTmRC3": {
                "timeAdded": 1480113719485
            }
        }
    },
    "groupMessages": {
        "-Kb9fw20GqapLm_b8JNE": {
            "-KbKWHv4J4XN22aLMzVa": {
                "from": "3JzxHLv4b6TcUBvFL64Tyt8dTXJ2",
                "text": "Hello",
                "timeSent": "1358491277463"
            },
            "-KfHxtwef6_S9C5huGLI": {
                "from": "S2GMKFPOhVhzZL7q4xAVFIHTmRC3",
                "text": "Goodbye",
                "timeSent": "1493948817230"
            }
        }
    }
}

这些安全规则:

{
    "rules": {
        "groupMessages": {
            ".indexOn": "timeSent",
            "$groupKey": {
                ".read": "root.child('groupUsers').child(auth.uid).child($groupKey).child('timeAdded').val() <= data.child('timeSent').val()"
                ".write": "!data.exists() && root.child('groupUsers').child(auth.uid).child($groupKey).exists() && newData.child('from').val() === auth.uid",
            }
        }
    }
}

这样,我想我可以检索特定组的消息,如下所示:

var myTimeAdded = /* already retrieved from the database */;
firebase.database()
  .ref('groupMessages/-Kb9fw20GqapLm_b8JNE')
  .orderByChild('timeSent')
  .startAt(myTimeAdded)
  .on('child_added', /* ... */);

但正如我所说,这是一个错误的假设。关于我如何实现这一目标有什么建议吗?


读取规则在您附加侦听器的位置强制执行。

所以在你的情况下就是groupMessages/-Kb9fw20GqapLm_b8JNE。如果您的用户具有读取权限,则允许侦听器。如果用户没有读取权限,则侦听器将被拒绝/取消。

这意味着规则不能用于过滤数据。我们经常将此称为“规则不是过滤器”,对于刚接触 Firebase 安全模型的开发人员来说,这是最常见的陷阱之一。看:

  • 这部分规则不是过滤器在 Firebase 文档中
  • 以前的有关提及“规则不是过滤器”的 Firebase 的问题

就其本身而言,您的规则并没有错:它们只允许访问每个特定的孩子,如果它不是太老的话。他们只是不允许您运行查询groupMessages/-Kb9fw20GqapLm_b8JNE不再了。

解决这个问题的常见方法是使用一个单独的结构(通常称为“索引”)物品的钥匙否则您的查询将返回。在您的情况下,它看起来可能会变成每个用户的索引,其中包含他们加入后所有消息的键。

但老实说,听起来您正在尝试以 SQL 方式使用安全规则。用户似乎不太可能不是allowed查看较旧的消息。更有可能的是,您不希望用户被旧消息打扰。在这种情况下,我只需通过查询来解决它(正如您已经拥有的那样)并删除".read" rule.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过安全规则中的某个子值限制查询 的相关文章

随机推荐

  • 需要 VSCode sendSequence 键绑定来执行上一个命令、下一个命令、移动到行首、移动到行尾终端命令

    我当前的自定义键绑定 key alt b command workbench action terminal sendSequence when terminalFocus args text u0017 key alt j command
  • 求解线性方程。使用 numpy 的三个变量[重复]

    这个问题在这里已经有答案了 我目前需要一门课程 它必须能够显示和求解如下所示的方程系统 2x 4y 4z 8 34x 3y z 30 x y z 108 我认为编写一个类将方程系统的左侧事物转换为类似矩阵的对象是一个好主意 这是该系统的自制
  • 最大并发 Socket.IO 连接数

    这个问题以前曾被问过 但最近没有被问过 也没有明确的答案 使用 Socket io 在需要添加另一台服务器之前 是否存在可以维持的最大并发连接数 有谁知道有哪些活跃的生产环境正在大规模使用 websockets 特别是 socket io
  • 如何在 ClickHouse 中向可执行 UDF 发送多个参数?

    我有一个输出输入的 python 脚本 usr bin python3 import sys if name main i 0 for line in sys stdin print i line end sys stdout flush
  • MySql REGEXP 运算符

    mySql REGEXP 运算符不区分大小写 该运算符是否有一个版本is区分大小写 Use the BINARY关键字 这迫使REGEXP将字符串匹配为二进制字符串 区分大小写 SELECT a REGEXP A a REGEXP BINA
  • Apache:禁用目录中的 php

    我想在我的服务器上的目录中禁用 php 我认为在 httpd conf 中设置 Options ExecCGI 会阻止执行 php 脚本 但显然我错了 所以 这就是我的 httpd conf 中的内容 它显然不起作用
  • ImportError:无法从“sklearn.base”导入名称“MultiOutputMixin”

    我只想用 scikit learn 进行线性回归 当我尝试导入线性模型包时 出现标题中的错误消息 我尝试遵循类似问题的解决方案 link 该建议基本上是删除请求 MultipleOutputMixin 的代码部分 当我这样做时 MultiO
  • 如何截取 YouTube 屏幕截图

  • 当用户关闭窗口选项卡时 JavaScript 发出警报

    我希望当用户关闭选项卡或窗口时 或者当他尝试移动到与我的站点不同的另一个位置时 弹出一个确认框 并且如果他确认执行 ajax 脚本 然后关闭或更改窗口 我不知道该怎么做 PS 我正在使用 jQuery window unload funct
  • 自定义 HtmlHelper 扩展方法在视图中不可用?

    我翻译了耶利米 克拉克的MVC 的复选框列表助手进入我的 VB Net 项目 但是当我尝试使用我认为的方法时 出现错误 CheckBoxList is not a member of System Web Mvc HtmlHelper Of
  • 如何以编程方式使折线图点处于活动/突出显示状态

    我使用的是 Chart js 2 0 beta2 页面和滑块上有几个折线图 我想突出显示每个折线图上与滑块位置匹配的数据点 它们都具有相同的点数 我不知道如何轻松地在代码中激活一个点 感谢您的任何提示 2 0 测试版解决方案 扩展您选择的图
  • 来自 JavaScript 的 JavaFX WebView 向上调用不起作用

    我有一个 JavaFX WebView 想要从 Web 视图中显示的 test html 调用 JavaBridge 类的方法 hello 为什么这不起作用 我确保 桥 对象仅在页面完全呈现时添加到 window object 因此这可能不
  • 能够在 print_r() 的输出中看到变量,但不确定如何在代码中访问它

    我用谷歌搜索 安装了 Devel Drupal for Firebug 但我找不到它 I found what我想要 我知道where这是 我只是不知道how为拿到它 为实现它 我将把它放在代码括号中 但 Devel 告诉我文件名 我想将其
  • 如何打印字符串中的每个字符?

    有没有一种方法可以一次从输入中读取一个字符并对其进行处理 而不需要对词汇进行标记 字符串上的 toCharArray 函数在这里可能很有用 for char c s toCharArray System out println c 并仅打印
  • 广播接收器作为 Android 中的内部类

    在我的代码中有一个扩展的内部类BroadcastReceiver 我已将以下行添加到AndroidManifest xml
  • 导入库项目时出现 NoClassDefFoundError

    我目前正在使用版本 4 6 1 Windows Vista Eclipse 编写一个单元测试项目 我的项目分为 3 部分 A 单元测试应用程序 类型 CLDC应用程序 B 待测试应用 类型 CLDC应用 C 一个库项目 类型 library
  • Portlet 中的 YUI 版本冲突问题

    我正在从 portlet 加载 yui js 3 3 0 版本文件 但 liferay 使用 3 2 0 yui js 文件 所以每当我加载该页面时 就会出现 js 错误 G ENV loaded VERSION 未定义 此错误出现在 yu
  • Struts2教程不起作用

    我正在学习struts2 我根据以下内容尝试我的 hello world 项目tutorial然后我在 eclipse 中运行代码 但这不起作用 控制台显示很多错误 第一个如下 com opensymphony xwork2 util lo
  • Iss 声明无效 Keycloak

    我使用 keycloak 服务登录我的网络应用程序 用作具有 oauth 2 0 安全性的后端 spring 当我使用从 keycloak 获得的不记名令牌向邮递员发出请求时 它给了我一个错误 401 并且也在旁边的答案文本中www Aut
  • 通过安全规则中的某个子值限制查询

    我正在努力想出构建部分数据库及其相关安全规则的最佳方法 我有聊天组 并且可以随时将用户添加到这些组中 当用户添加到组中时 他们应该只能检索发送的消息after那 他们不应该检索在他们 用户 添加到组之前发送的任何消息 我的第一种方法错误地假