【问题标题】:Firestore security rules check document key changeFirestore 安全规则检查文档密钥更改
【发布时间】:2018-06-15 22:40:13
【问题描述】:

我们是否能够检查文档中的哪个键在 Firestore 安全规则中发生了更改?然后检查已更改的对象?我在试图弄清楚这一点时遇到了很多麻烦。很难测试。

谢谢瑞恩

【问题讨论】:

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


    【解决方案1】:

    通过规则检查文档中哪些字段已更改的新规范方法是将其与现有文档进行比较:

    request.resource.data.diff(resource.data).affectedKeys().hasAll(["a", "b", "c"]);
    

    【讨论】:

    • 它不起作用:request.writeFields.hasOnly(['a') == true;不会和 request.resource.data.diff(resource.data).affectedKeys().hasOnly(['name']) == true;
    • 对,那是因为writeFields 已被弃用并且行为不可靠。
    • 对不起,你不明白我的意思。 writeFields 按预期工作,...affectedKeys()... 不能正常工作。我尝试了很多,但没有任何结果。
    • 我不确定您要完成什么,但除了affectedKeys() 之外还有其他方法,例如addedKeys(),可能与您的用例相匹配。作为该语言的开发人员,如果您对affectedKeys() 有任何问题,请告诉我具体的故障模式,以便我修复它们! firebase.google.com/docs/reference/rules/rules.MapDiff
    • 我用我的测试创建了一个 git repo。你会看那个github.com/OleksiiBrylin/firestore-rules
    【解决方案2】:

    注意:我了解到 writeFields 并非在所有情况下都与控制台中的规则模拟器不兼容。这不包括allow create 的情况。我不再推荐这个答案。

    request.writeFields 包含请求中更改的字段的键列表。 request.resource.data 包含请求中的值,resource.data 包含当前值。例如:

    // Allow an update if only the name field is changing and
    // only if it's not equal to the current last_name field
    
    allow update: if request.writeFields.size() == 1
                 && 'name' in request.writeFields
                 && request.resource.data.name != resource.data.last_name;
    

    【讨论】:

    • 在最后一行:不应该是 >> && request.resource.data.name != resource.data.last_name;
    猜你喜欢
    • 2020-06-19
    • 2020-07-04
    • 2019-11-02
    • 1970-01-01
    • 2019-03-03
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多