首页 > 解决方案 > 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,我必须再次使用基本相同的函数,但这次除外我会硬编码lastNamefunction 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 控制台或规则模拟器不允许这种语法是不可能的?

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


根据文档,resource.data 具有类型 rules.Map,您可以使用 [] 运算符或 get 方法访问它:

function isString(fieldName) { 
    return request.resource.data[fieldName] is string;
}

推荐阅读