【问题标题】:Firestore / Security Rule / Function / Fieldname as Parameter?Firestore / Security Rule / Function / Fieldname 作为参数?
【发布时间】:2021-08-01 04:41:21
【问题描述】:

我想要一个 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作为参数这样我就可以做到这一点,从而不必为我想验证的每个字段名重复代码但是真的只有一个功能用于 n 个字段名称:

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 控制台或规则模拟器不允许这种语法是不可能的?

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

    根据the documentation,resource.data有类型rules.Map,可以通过[]操作符或者get方法访问:

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

    【讨论】:

    • 路易斯的回答很好!它有助于认识到安全规则是 JavaScript 的一个广泛子集,因此您在这里 using bracket notation 允许动态字段名称。
    【解决方案2】:

    太好了,非常感谢,效果很好,我就是这样用的

    match /public/{uid} {
            allow read
            allow write: if isString('userProfession')
          }
    

    即fieldName 是一个字符串,因此用单引号括起来。

    【讨论】:

      猜你喜欢
      • 2013-08-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多