【问题标题】:Firestore Security Rules: hasOnly not working?Firestore 安全规则:hasOnly 不起作用?
【发布时间】:2019-07-31 10:06:35
【问题描述】:

我只想更新文档中的一些字段,所以我在文档here 中找到了hasOnly 函数 但它不起作用,例如,下面的规则不起作用

function isValid(data){
   return data.keys().hasOnly(['name','email','password'])
}

当我在客户端 SDK 中更新时

firestore.document("users/user_doc")
            .update(mapOf(
                "name" to "Jack",
                "email" to "jack@gmail.com",
                "password" to "12345"
            )).addOnCompleteListener {
                if (it.isSuccessful){
                    Log.d("app", "success")
                }else{
                    Log.d("app", "failed")
                }
            }

但它显示一个缺少权限的错误

还有hasAll 函数总是返回true! 那么这个功能存在吗?为什么它不工作?

谢谢。

【问题讨论】:

  • 请记住,request.resource 包含写入操作成功时将显示的文档,因此它也包含现有字段,而不仅仅是您正在更新的字段。您的文档是否有比nameemailpassword更多的字段?
  • yes 包含其他字段,但我不想更新它。我的问题是我只想更新文档中的某些字段。我可以通过使用 writeFields 来做到这一点,但这已在功能中被删除。您能指导我如何更新某些字段以及最好的方法吗? @FrankvanPuffelen

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


【解决方案1】:

请记住,request.resource contains 是写入操作成功时将显示的文档。它还包含现有字段,而不仅仅是您正在更新的字段。

如果有更多字段,您需要检查这些字段是否未被写入操作修改。因此,您将检查它们在request.resourceresource 中是否具有相同的值。我经常在我的规则中使用这样的函数:

function isUnmodified(key) {
  return request.resource.data[key] == resource.data[key]
}

如果您的文档有一个额外的字段created,您需要确保它没有被修改:

return data.keys().hasOnly(['name','email','password', 'created']) && isUnmodified('created')

【讨论】:

  • 非常感谢,它帮助我正确理解。但是,如果客户端还发送其他数据以及name, email,password,规则是否被拒绝?如果不是这样的规则怎么写?
  • 您的原始规则已经拒绝添加额外字段的写入操作。但是,是的,我的回答中的规则也会拒绝此类写入。此外,我的答案中的规则拒绝更改 created 值的写入。
  • 谢谢弗兰克!我一遍又一遍地阅读文件。但只读了“它也包含现有字段”,我开始了解“request.resource”的值。
【解决方案2】:

另一种选择是:

allow update: if request.resource.data.diff(resource.data).changedKeys().hasOnly(["name", "email", "password"]);

New improvements to Firestore Security Rules

【讨论】:

  • 太棒了。这在更新操作中非常有用。
  • 我注意到 .diff().changedKeys() 只会返回现有字段的差异。它不会阻止更新对象中的新字段被添加。
猜你喜欢
  • 1970-01-01
  • 2019-01-31
  • 2018-03-19
  • 2021-05-12
  • 2021-11-22
  • 2019-09-06
  • 2018-05-28
  • 2020-08-24
相关资源
最近更新 更多