首页 > 解决方案 > Firestore 安全规则:hasOnly 不起作用?

问题描述

我只想更新文档中的某些字段,因此我在此处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函数总是返回真!那么这个功能存在吗?为什么它不工作?

谢谢。

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


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

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

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

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

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

推荐阅读