firebase - 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
函数总是返回真!那么这个功能存在吗?为什么它不工作?
谢谢。
解决方案
请记住,request.resource contains
如果写入操作成功,将显示该文档。它还包含现有字段,而不仅仅是您正在更新的字段。
如果有更多字段,您将需要检查这些字段是否未被写入操作修改。因此,您将检查它们在request.resource
and中是否具有相同的值resource
。我经常在我的规则中使用这样的函数:
function isUnmodified(key) {
return request.resource.data[key] == resource.data[key]
}
如果您的文档有一个额外的字段created
,您将确保它没有被修改:
return data.keys().hasOnly(['name','email','password', 'created']) && isUnmodified('created')
推荐阅读
- android - 如何将 Glide 与 GridView 一起使用?(安卓/科特林)
- angularjs - 使用 routeParams 观看路线不起作用
- sql - 如何在 GROUP BY c 之后计数(DISTINCT a,b)
- matplotlib-basemap - 如何使用 Matplotlib 底图绘制北半球地图,投影为正投影
- ruby-on-rails - 如何使用 ruby 在 BigQuery 中设置 QueryJobConfig?
- compiler-construction - 替代在扫描仪中备份?
- android - 如何在android中进行单线程改造调用
- python-3.x - 带有 asyncio 和 aiohttp 的异步程序的最佳架构
- vue.js - 使用 Vue HTTP GET 请求时如何避免“Access-Control-Allow-Origin is not allowed”错误?
- bazel - 跳过目标的特使问题