Firestore安全规则:hasOnly不起作用?

时间:2019-07-31 10:06:35

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

我只想更新文档中的某些字段,所以我在文档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! 那这个功能存在吗?为什么不起作用?

谢谢。

2 个答案:

答案 0 :(得分:3)

另一种方法是:

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

New improvements to Firestore Security Rules

答案 1 :(得分:0)

请记住,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')