Firebase Firestore子集合安全查询

2023-12-25

我的 Cloud Firestore 数据库中有以下规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /performances/{performanceId} {
      allow read, update, delete: if request.auth.uid == resource.data.owner;
      allow create: if request.auth.uid != null;
    }
  }
}

这个想法是,如果您拥有表演,则可以读取和写入表演;如果您已登录,则可以创建表演。

这个查询工作正常:

db.collection("performances").whereEqualTo(FieldPath.of("owner"), user.getUid())

但是,如果我想获取“场景”子集合的内容,则会收到错误:“com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:权限缺失或不足。” 这是通过以下查询:

db.collection("performances")
            .document(performanceID)
            .collection("scenes");

我假设我需要将查询限制为如下所示,但这不会起作用,因为 whereEqualTo 的输出是查询而不是 CollectionReference,因此我无法访问“文档”:

db.collection("performances")
   .whereEqualTo(FieldPath.of("owner"), user.getUid())
   .document(performanceID)
   .collection("scenes");

那么,有谁知道如果主集合有安全规则,我应该如何访问子集合?

更新1(因为代码没有在下面的注释中格式化)

我想我可能已经想出了一个解决方案。我没有意识到我的安全规则默认会拒绝从子集合中读取,因此将其更改为允许对表演中的场景进行所有读取和写入使其工作正常:

service cloud.firestore {
  match /databases/{database}/documents {
    match /performances/{performanceId} {
      allow read, update, delete: if request.auth.uid == resource.data.owner;
      allow create: if request.auth.uid != null;
      
      match /scenes/{sceneId} {
        allow read, write: if true
      }
    }
  }
}

首先,请注意规则不会级联,因此您的解决方案实际上会打开所有文档scenes子集合向全世界公开,而不仅仅是父文档的所有者。

您需要使用以下命令检查父文档的权限get()规则中的方法。

service cloud.firestore {
   match /databases/{database}/documents {
      match /performances/{performanceId} {
         allow read, update, delete: if request.auth.uid == resource.data.owner;
         allow create: if request.auth.uid != null;

         function parentDoc() {
             return get(/databases/$(database)/documents/performances/$(performanceId)).data;
         }

         match /scenes/{sceneId} {
            allow read, write: if parentDoc().owner = request.auth.uid;
         }
      }
   }
}

在子集合规则中,我们使用之前捕获的路径段来查找我们需要检查的父文档。

最后,你可能想要收紧你的create规则也。目前,它允许某人创建其他人(或无人)拥有的文档。我怀疑你想要那个。通过检查请求者的 ID 是否在传入文档中,您可以防止潜在的错误,这些错误允许创建用户无法读取的文档:

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

Firebase Firestore子集合安全查询 的相关文章

  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 如何设置Firestore安全规则? Resource.data:空值错误

    我需要一些帮助来使我的 Firestore 安全规则发挥作用 这些是我的 Firestore 规则 service cloud firestore match databases database documents match order
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Firebase ref.removeAllObservers() 是否也会递归删除子观察者?

    我看到了一些与此相关的问题 但没有一个真正证实了我的疑问 If I removeAllObservers 在父节点上 这是否也会递归地删除可能已附加在所有子节点和子节点的子节点等处的所有其他观察者 递归地 API 文档为removeAllO
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • vim中将制表符替换为空格

    我想在 gVim 中将制表符转换为空格 我将以下行添加到我的 vimrc set tabstop 2 它可以在两个空格处停止 但看起来仍然像插入了一个 tab 键 之后我尝试使用 h 键来计算空格数 我不知道应该怎么做才能让 gVim 将制
  • 在 iOS 上使用 OpenAL 进行声音捕捉

    我正在尝试使用 OpenAL 在 iOS 上进行声音捕获 我正在编写一个跨平台库 这就是为什么我避免使用特定于 iOS 的声音录制方式 开箱即用的 OpenAL 捕获不起作用 但存在一个已知的解决方法 在开始捕获之前打开输出上下文 http
  • 当前上下文中不存在名称“ViewBag” - Visual Studio 2015

    我再次开始使用 ASP NET 进行开发 但在 Visual Studio 中遇到了一个小错误 我的 cshtml 文件在使用一些 razor 函数时显示错误 例如 名称 ViewBag 在当前上下文中不存在 这是一张图片 我正在使用一个演
  • 如何用长文本填充DIV并在溢出时显示省略号

    我有以下 JSFiddle http jsfiddle net ofrj55j4 21 http jsfiddle net ofrj55j4 21 如何在显示省略号之前在 DIV 中显示尽可能多的文本 现在只显示一行 HTML div cl
  • 是否可以在javascript中创建固定长度的数组?

    在Javascript中 是否可以创建一个保证长度保持不变的数组 例如 数组A创建的长度为 2 随后 任何调用的尝试A push or A pop 或设置值A 5 将失败 A length永远是 2 这是输入数组的方式 例如Float32A
  • 选择列表框中的项目后打开新表单

    我的表单上有一个列表框和一个按钮 列表框包含 3 个元素 房屋 人物 户外 我还创建了 3 个表单来表示列表框中的值 我希望用户突出显示列表框中的项目 单击按钮后我想打开用户选择的表单 我怎样才能实现这个目标 我已经尝试过这个链接 通过单击
  • groovy 脚本中提供的名称无效(机制级别:KrbException:无法找到默认领域)

    我有一个连接到 MSSQL 数据库的 groovy 脚本 几周前它工作得很好 但今天我上传了 mac os 的最后一个版本 我的脚本给了我这个例外 Caught java sql SQLException I O Error GSS Fai
  • d3.js:强制布局中建议的节点位置

    我想创建一个图表 其中节点具有建议的位置 但我也想使用力布局来确保节点本身不重叠 这在d3中可能吗 是的 您可以通过以下方式执行此操作 禁用默认的重力和电荷力 实施碰撞检测 http mbostock github com d3 talk
  • Dockerhub 的访问令牌

    我创建了一个存储库hub docker com现在想要使用我的凭据将我的映像推送到 Dockerhub 我想知道是否必须使用我的用户名和密码 或者是否可以创建某种访问令牌来推送 docker 映像 我想做的是使用docker image来自
  • 如何找到 php_smart_string.h 而不是 php_smart_str.h?

    It s me tmp pear install inclued 0 1 3 make bin bash tmp pear install inclued 0 1 3 libtool mode compile cc I I tmp pear
  • 创建 DLL 以在两个进程之间共享内存

    我需要使用 DLL 来实现类似于 Linux 共享内存的功能 我的Windows编程经验很少 但我认为有可能实现我的目标 我想要类似下面的东西 DLL int x void write int temp x temp int read re
  • Webpack 错误:请手动安装 sqlite3 包

    我正在使用 Electron 和 Sequelize 构建一个应用程序 我开始配置数据库 然后 我收到此错误 未捕获的错误 请手动安装 sqlite3 包 在新的 ConnectionManager home matheusdrdj Doc
  • 快速递增 Int!不工作

    我理解选项是如何工作的 但这让我陷入了困境 我有一个变量叫做num我想增加它 所以我做了以下操作 var num Int 0 num ERROR Unary operator cannot be applied to an operand
  • 如何在 Playground 中运行异步回调

    许多 Cocoa 和 CocoaTouch 方法都具有在 Objective C 中作为块实现的完成回调以及在 Swift 中作为闭包实现的回调 然而 当在 Playground 中尝试这些时 永远不会调用完成 例如 Playground
  • 如何在Android中以编程方式从网络下载文件?

    在我的应用程序中 从 Web 下载大量文件 这些文件大小约为 200Mb 已压缩 如何在 Android 中以编程方式下载文件 实际上我关心的是代码的性能 如何处理其间的错误和网络问题 这是我最近为此编写的一些代码 try URL u ne
  • 来自 sqlalchemy 的 psycopg2 register_composite

    是否可以以某种方式使用函数注册复合材料 http initd org psycopg docs extras html psycopg2 extras register composite来自 psycopg2 当我使用 sqlalchem
  • 有没有办法可以将 FormattedText 包含在 Xamarin.Forms 的 .alert 中?

    我有一个格式化的字符串 在代码中 它不止于此 但这只是一个示例 var fs new FormattedString fs fs Spans Add new Span Text ABC ForegroundColor Color FromH
  • 将 Inno Setup 中许可证向导页面上的单选按钮替换为复选框

    有没有简单的方法可以用 Inno Setup 中的单个 选中 未选中 复选框替换许可证向导页面上的标准 2 个单选按钮 而无需创建自定义页面 由于没有设置可以在许可证单选按钮和某些许可证复选框之间切换 至少只是因为在WizardForm 你
  • 虚函数和 std::function?

    考虑以下 C 17 代码 include
  • Firebase Firestore子集合安全查询

    我的 Cloud Firestore 数据库中有以下规则 service cloud firestore match databases database documents match performances performanceId