firebase - Firestore / Security Rule / Function / Fieldname 作为参数?
问题描述
我想要一个firestore安全规则功能,我可以用它来检查特定文档字段(request.resource.data.<some_field_name>
)的传入数据是否属于某种类型,例如string
。
通过简单示例解释用例
对于称为它的特定字段firstName
,可以像这样轻松完成:
rules_version = '2'
service cloud.firestore {
match /users/{uid} {
allow read
allow write: if isString()
}
}
function isString() { return request.resource.data.firstName is string }
什么在实践中有效但不实用
但是,我必须firstName
在函数内部进行硬编码,因此该函数不是通用的,即如果我还想检查此文档上的另一个字段是否lastName
属于类型string
,我必须再次使用基本相同的函数,但这次除外我会硬编码lastName
:
function isString() { return request.resource.data.lastName is string }
然后相应地重命名函数,所以我最终得到如下内容:
rules_version = '2'
service cloud.firestore {
match /users/{uid} {
allow read
allow write: if firstNameisString() || lastNameisString()
}
}
function firstNameisString() { return request.resource.data.firstName is string }
function lastNameisString() { return request.resource.data.lastName is string }
我想做的事
但我真正想要的是我可以提供fieldName
作为参数的东西,这样我就可以做到这一点,从而不必为我想验证的每个 fieldName 复制代码,但实际上只有一个用于 n fieldNames 的函数:
rules_version = '2'
service cloud.firestore {
match /users/{uid} {
allow read
allow write: if isString(fieldName)
}
}
function isString(fieldName) { return request.resource.data.fieldName is string }
我是否遗漏了一些非常明显的东西,或者为什么由于 firebase 控制台或规则模拟器不允许这种语法是不可能的?
解决方案
根据文档,resource.data 具有类型 rules.Map,您可以使用 [] 运算符或 get 方法访问它:
function isString(fieldName) {
return request.resource.data[fieldName] is string;
}
推荐阅读
- swift - .onAppear 运行 SwiftUI 时视图未刷新
- html - 加载音频文件会生成什么类型的 HTTP 请求?
- django-allauth - django-allauth - 在确认电子邮件中显示用户电子邮件地址
- javascript - 将多个表情符号选择器(按钮)附加到多个文本区域
- python - How to use nevergrad to find the minimum of a cost function over the field of integers?
- python - Python - dask:调用 map_blocks 并返回新维度错误
- payment-gateway - 3 位卡代码失败并出现错误 E00003 根据其数据类型,值 XXXXXXX 无效 - 模式约束失败
- node.js - heroku - Google Cloud Storage H13“连接关闭且无响应”
- html - 使用 z-index 进行重叠时,如何将我的文本定位在 div 中?
- javascript - 没有ID的React Bootstrap自定义复选框?