Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >-如何检查字段是否正在/未被修改?

-如何检查字段是否正在/未被修改?
EN

Stack Overflow用户
提问于 2018-01-09 13:11:47
回答 10查看 10.5K关注 0票数 21

对于我的生活,我不明白为什么下面的结果是一个允许写的false。假设我的users集合为空开始,并且我正在从我的角度前端编写以下形式的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  displayName: 'FooBar',
  email: 'foo.bar@example.com'
}

我现在的安全规则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      function isAdmin() {
        return resource.data.role == 'ADMIN';
      }

      function isEditingRole() {
        return request.resource.data.role != null;
      }

      function isEditingOwnRole() {
        return isOwnDocument() && isEditingRole();
      }

      function isOwnDocument() {
        return request.auth.uid == userId;
      }

      allow read: if isOwnDocument() || isAdmin();
      allow write: if !isEditingOwnRole() && (isOwnDocument() || isAdmin());
    }
  }
}

一般来说,我不希望任何用户能够编辑他们自己的角色。普通用户可以编辑自己的文档,管理员也可以编辑任何人的文档。

isEditingRole()设置false会给出预期的结果,所以我把范围缩小到了这个表达式。

写的一直是假的,我无法确定原因。任何想法或修正都是有帮助的!

编辑1

我尝试过的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isEditingRole() {
  return request.resource.data.keys().hasAny(['role']);
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isEditingRole() {
  return 'role' in request.resource.data;
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isEditingRole() {
  return 'role' in request.resource.data.keys();
}

编辑2

请注意,最终,管理员将为用户设置一个角色,因此最终可能会在文档中存在一个角色。这意味着,根据下面的修复文档,请求将有一个role密钥,即使不在原始请求中。

将资源中存在的请求中未提供的字段添加到request.resource.data中。规则可以通过将request.resource.data.fooresource.data.foo进行比较来测试字段是否被修改,同时知道resource中的每个字段也将出现在request.resource中,即使它不是在写请求中提交的。

据此,我认为“编辑1”中的三个选项被排除在外。我确实尝试过request.resource.data.role != resource.data.role的建议,但这也不起作用.我茫然不知所措,开始怀疑Firestore中是否真的有一个bug。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2018-01-11 11:20:16

因此,最后,我似乎假设resource.data.nonExistentField == null会返回false,而实际上它会返回一个Error (根据和我的测试)。所以我最初的解决方案可能就是碰到了这个问题。这是令人费解的,因为根据医生们,相反的方法应该有效,但也许文档是指一个“不存在”的值,而不是关键--一个微妙的区别。

我仍然没有达到100%的清晰度,但这是我最终成功的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isAddingRole() {
  return !('role' in resource.data) && 'role' in request.resource.data;
}

function isChangingRole() {
  return 'role' in resource.data && 'role' in request.resource.data && resource.data.role != request.resource.data.role;
}

function isEditingRole() {
  return isAddingRole() || isChangingRole();
}

另一件仍然令我困惑的事情是,根据文档,我不应该需要&& 'role' in request.resource.data部件在isChangingRole()中,因为它应该由Firestore自动插入。尽管情况似乎并非如此,因为删除它会导致我的写权限问题失败。

可能会通过将写入到createupdatedelete部件中,而不是仅通过allow write: if !isEditingOwnRole() && (isOwnDocument() || isAdmin());来澄清/改进。

票数 6
EN

Stack Overflow用户

发布于 2018-01-09 14:43:26

如果您创建一个自定义函数来检查更新,那么您的规则将更加可读性和可维护性。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
service cloud.firestore {
  match /databases/{database}/documents {
    function isUpdatingField(fieldName) {
      return (!(fieldName in resource.data) && fieldName in request.resource.data) || resource.data[fieldName] != request.resource.data[fieldName];
    }

    match /users/{userId} {
      // Read rules here ...
      allow write: if !isUpdatingField("role") && !isUpdatingField("adminOnlyAttribute");
    }
  }
}
票数 9
EN

Stack Overflow用户

发布于 2018-02-21 18:55:44

我用writeFields解决了这个问题。请试试这个规则。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
allow write: if !('role' in request.writeFields);

在我的例子中,我使用list来限制更新字段。它也很管用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
allow update: if !(['leader', '_created'] in request.writeFields);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48176704

复制
相关文章
shell脚本 检查文件是否被修改
1.进行检测目录的添加,可以多个目录 2.添加定时任务,可以一分钟一次,有改动会输出改动情况 #!/bin/bash #2020-3-14 #监测文件是否被修改脚本 #监测目录 dir_file=(/etc) file_list=/usr/local/file_list.txt error_file=/usr/local/error_list.txt display_path() { for i in `ls` do if [[ -d $i ]];then             cd $i    
陈不成i
2021/06/23
2.3K0
RedHat 8 如何检查端口是否联通
其中可能有各种原因导致端口没有联通,通常为操作系统本身的防火墙,托管服务器中心的防火墙等。
HoneyMoose
2021/09/04
2.2K0
RedHat 8 如何检查端口是否联通
如何检查linux是否安装了php
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113426.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
4.3K0
如何检查linux是否安装了php
在mysql中如何修改字段类型_MySQL怎么修改字段类型?「建议收藏」
在MySQL中,可以通过alter table语句来修改表中一个字段的数据类型。下面本篇文章就来带大家了解一下alter table语句,介绍如何修改字段类型,希望对大家有所帮助。
全栈程序员站长
2022/09/05
28.1K0
MySQL修改字段名、修改字段类型
修改字段 类型、名、注释、类型长度、默认值 ALTER TABLE 表名 MODIFY [COLUMN] 字段名 新类型 新类型长度 新默认值 新注释; -- COLUMN关键字可以省略不写 -- 能修改字段类型、类型长度、默认值、注释 alter table table1 modify column column1 decimal(10,1) DEFAULT NULL COMMENT '注释'; -- 能修改字段类型、类型长度、默认值、注释 alter table table
JavaEdge
2021/03/04
30.2K0
MySQL修改字段名、修改字段类型
如何判断 ScrollView、List 是否正在滚动中
判断一个可滚动控件( ScrollView、List )是否处于滚动状态在某些场景下具有重要的作用。比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动时,自动关闭已经打开的侧滑菜单。遗憾的是,SwiftUI 并没有提供这方面的 API 。本文将介绍几种在 SwiftUI 中获取当前滚动状态的方法,每种方法都有各自的优势和局限性。
东坡肘子
2022/12/16
3.8K0
如何判断 ScrollView、List 是否正在滚动中
如何检查 Android 设备是否支持 Widevine DRM
想知道您的 Android 设备是否可以流式传输来自 Netflix 和 Amazon Prime Video 的高清视频?这是检查 Widevine DRM 支持的方法!
天天Lotay
2023/10/15
2.8K0
如何检查 Android 设备是否支持 Widevine DRM
注册前如何检查域名是否违规过
如果域名前主人用域名做坏事被拦截了,拦截信息并不会在新注册后被自动消除,而是需要手动拨打申述电话申述解除,比较麻烦。
kr
2022/09/28
4.1K0
注册前如何检查域名是否违规过
Mysql修改字段名、修改字段类型
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130167.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/10
7K0
【说站】js如何检查是否满足条件
1、every只有满足每个条件才能返回true,some是任何一个满足返回true的项目,filter过滤出所有符合条件的项目(找不到返回空)。
很酷的站长
2022/11/24
2.2K0
【说站】js如何检查是否满足条件
育种中如何检查系谱是否有错误
这里推荐我写的R包learnasreml中的check_pedigree函数,简单好用,结果友好。能够检查:
邓飞
2021/12/12
2.8K0
注册前如何检查域名是否违规过
如果域名前主人用域名做坏事被拦截了,拦截信息并不会在新注册后被自动消除,而是需要手动拨打申述电话申述解除,比较麻烦。
kr
2022/09/06
3.7K0
SAP 如何修改字段的文本描述
在实际业务开展中,需要将SAP使用较低或不用的标准字段借用于其它用户,则需要将某个字段的名称描述改成另一个名称描述,例如小编计划把物料主数据的旧物料号字段用于来存放某个关联系统的对应物料号,具体操作步骤如下:
用户5495712
2020/05/13
2.5K0
如何在XMLMap端口修改字段映射?
在使用知行EDI系统的过程中,我们经常会用到XMLMap端口进行数据转化,XMLMap端口可以通过拖拽方式进行字段取值映射,同时也可以写代码添加字段对应的取值及判断条件。有时在完成映射后,发现源文件/目标文件待映射的字段和段落需要添加、删除,或者取值逻辑需要调整,可以按照以下步骤解决:
知行软件EDI
2022/12/13
9960
oracle 字段类型修改_数据库修改字段
大家好,又见面了,我是你们的朋友全栈君。 有一个表名为tb,字段段名为name,数据类型nchar(20)。
全栈程序员站长
2022/10/04
3.5K0
Hive修改字段
   Hive只是传统关系数据库和现在流行的分布式数据库的衍生物,所以在很多方面还不是很成熟。Hive修改字段的时候就会有许多问题产生,比如历史分区的数据会为null。
幽鸿
2020/04/02
1.2K0
修改表字段长度的操作,对业务是否有影响?
可能隐约之中,我们觉得没影响,但又好像有影响,究竟有何影响,我们从实验来看最科学。
bisal
2019/01/29
3.4K0
SQL语句增加字段、修改字段、修改类型、修改默认值[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143685.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
4K0
如何检查 Java 数组中是否包含某个值 ?
在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题。比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下。
用户7886150
2021/04/28
9.1K0
点击加载更多

相似问题

Rspec如何检查表是否未被修改

13

jQuery -检查输入字段是否未被触及

12

如何检查文件字段是否正在使用

11

检查字段是否已被修改

17

检查文件是否未被修改或更改的最佳方法

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文