Firebase 存储安全规则:检查另一个对象是否存在/检查对象的元数据
Firebase Storage Security Rule : Check if another object exists / check object's metadata
在 Firebase 存储安全规则(不是实时数据库)中,有什么方法可以检查路径中是否存在另一个对象,或者另一个对象的元数据是否存在?
一些背景
目前我的存储安全规则设置为用户只有读取权限,而没有对其 /users/{userId}/
路径的写入权限。
我有一个管理云功能,可以将文件保存到 /users/{userId}/necessary-file.pdf
。而且我不希望用户能够修改或写入此文件,并且只有云功能有权这样做。为此,我想我可以匹配文件名,例如:
match /users/{userId}/{fileName} {
allow write: if !fileName.matches("necessary-file.pdf")
}
问题
我有什么办法只允许用户写 some-other-file.pdf 如果他们已经有 necessary-file.pdf 在同一条路径上(或者如果效果更好的话,甚至在其他地方)。同时仍然不允许他们写 necessary-file.pdf.
那么我有什么办法可以做这样的伪代码吗? :
match /users/{userId}/{fileName} {
allow read: if request.auth.uid == userId;
allow write: if (!fileName.matches("necessary-file.pdf")) && ("necessary-file.pdf".exists())
}
作为替代方案,我可以让我的云函数将元数据写入 necessary-file.pdf 并检查它。有什么办法可以执行类似这种伪代码的操作吗? :
allow write: if "necessary-file.pdf".metadata['canUserWrite'] == 'yesUserCan'
终于
真正酷的是,如果这是远程可能的,它可以用于以非实时方式在 firebase 数据库和 firebase 存储规则之间进行通信。 (referring to this question here) 云函数可以监听实时数据库中预期字段的变化,并将文件写入 firebase 存储,firebase 存储可以检查。
Firebase 的云存储安全规则只能访问有关当前请求和文件的信息。他们无权访问完整的存储系统,因此无法检查是否存在另一个文件。
这是因为规则是在内存中针对每个请求进行评估的。为其他对象提供对 Cloud Storage 的访问权限会降低性能,使系统无法扩展。同样的原因也解释了为什么您无法从安全规则访问 Firebase 数据库。
如果您想要这样的控制,您需要查看 Cloud Functions for Firebase。如果您让用户将他们的文件上传到 "staging" 区域,您可以让 Cloud Functions 验证他们是否满足所有先决条件,然后才将文件移动到实际位置(使其可用于进一步处理或供客户使用)见)。
(另一种解决方案)使用授权声明限制存储访问
云存储规则可以访问请求用户的授权信息。通过在授权过程中设置检查,可以添加 auth 属性 以供以后在存储规则中进行访问验证。
原题:
Is there any way for me to only allow users to write
some-other-file.pdf if they already have a necessary-file.pdf at the
same path (or even somewhere else if that works better). All while
still disallowing them to write necessary-file.pdf.
是的,这可以通过检查 auth.token
.
来完成
带有 Google 登录的 Web 应用程序的示例流程:
- 创建一个 Cloud Functions 函数来设置自定义声明,以检查当前授权用户是否存在该文件。
- 用户通过 Google 授权成功后,调用该云函数为其设置 auth 对象的值。
- 在存储规则中勾选
auth.token
。
自定义声明的 Web 示例:
https://firebase.google.com/docs/auth/admin/custom-claims?hl=ro#examples_and_use_cases
示例存储规则:
https://firebase.google.com/docs/storage/security/rules-conditions?hl=ro#group_private
在 Firebase 存储安全规则(不是实时数据库)中,有什么方法可以检查路径中是否存在另一个对象,或者另一个对象的元数据是否存在?
一些背景
目前我的存储安全规则设置为用户只有读取权限,而没有对其 /users/{userId}/
路径的写入权限。
我有一个管理云功能,可以将文件保存到 /users/{userId}/necessary-file.pdf
。而且我不希望用户能够修改或写入此文件,并且只有云功能有权这样做。为此,我想我可以匹配文件名,例如:
match /users/{userId}/{fileName} {
allow write: if !fileName.matches("necessary-file.pdf")
}
问题
我有什么办法只允许用户写 some-other-file.pdf 如果他们已经有 necessary-file.pdf 在同一条路径上(或者如果效果更好的话,甚至在其他地方)。同时仍然不允许他们写 necessary-file.pdf.
那么我有什么办法可以做这样的伪代码吗? :
match /users/{userId}/{fileName} {
allow read: if request.auth.uid == userId;
allow write: if (!fileName.matches("necessary-file.pdf")) && ("necessary-file.pdf".exists())
}
作为替代方案,我可以让我的云函数将元数据写入 necessary-file.pdf 并检查它。有什么办法可以执行类似这种伪代码的操作吗? :
allow write: if "necessary-file.pdf".metadata['canUserWrite'] == 'yesUserCan'
终于
真正酷的是,如果这是远程可能的,它可以用于以非实时方式在 firebase 数据库和 firebase 存储规则之间进行通信。 (referring to this question here) 云函数可以监听实时数据库中预期字段的变化,并将文件写入 firebase 存储,firebase 存储可以检查。
Firebase 的云存储安全规则只能访问有关当前请求和文件的信息。他们无权访问完整的存储系统,因此无法检查是否存在另一个文件。
这是因为规则是在内存中针对每个请求进行评估的。为其他对象提供对 Cloud Storage 的访问权限会降低性能,使系统无法扩展。同样的原因也解释了为什么您无法从安全规则访问 Firebase 数据库。
如果您想要这样的控制,您需要查看 Cloud Functions for Firebase。如果您让用户将他们的文件上传到 "staging" 区域,您可以让 Cloud Functions 验证他们是否满足所有先决条件,然后才将文件移动到实际位置(使其可用于进一步处理或供客户使用)见)。
(另一种解决方案)使用授权声明限制存储访问
云存储规则可以访问请求用户的授权信息。通过在授权过程中设置检查,可以添加 auth 属性 以供以后在存储规则中进行访问验证。
原题:
Is there any way for me to only allow users to write some-other-file.pdf if they already have a necessary-file.pdf at the same path (or even somewhere else if that works better). All while still disallowing them to write necessary-file.pdf.
是的,这可以通过检查 auth.token
.
带有 Google 登录的 Web 应用程序的示例流程:
- 创建一个 Cloud Functions 函数来设置自定义声明,以检查当前授权用户是否存在该文件。
- 用户通过 Google 授权成功后,调用该云函数为其设置 auth 对象的值。
- 在存储规则中勾选
auth.token
。
自定义声明的 Web 示例: https://firebase.google.com/docs/auth/admin/custom-claims?hl=ro#examples_and_use_cases
示例存储规则: https://firebase.google.com/docs/storage/security/rules-conditions?hl=ro#group_private