【问题标题】:An issue with preventing users from changing specific document fields in Firestore阻止用户更改 Firestore 中特定文档字段的问题
【发布时间】:2019-04-17 12:27:52
【问题描述】:

我在我的 Android 项目中使用 firebase,我在 Cloud Firestore 数据库中有一个用户集合,用户只能更新一些字段,但可以读取所有字段,我知道无法保护文档的子集免受正在更新,并且安全规则只能应用于整个文档,所以我搜索了这个,我发现的唯一解决方案是在用户文档中创建一个子集合并在这个子集合中创建一个新文档,最后放我想在那里保护的字段,然后我可以在安全规则部分应用此代码轻松保护此文档:

match /users/{userId}/securedData/{securedData} {
  allow write: if false;
  allow read: if true;
}

所以现在这些字段没有人可以写,但是任何人都可以读,这正是我想要的,但是后来我发现我需要根据子集合内部的字段来查询用户,也就是所谓的集合目前不支持组查询,所以我最终得到了两个解决方案:

  1. 检索所有用户并在客户端过滤它们,但这会增加文档读取的数量,因为我正在查询所有用户集合文档+为每个用户读取的额外子集合文档以获得所需的字段过滤用户。
  2. 不要在用户文档中创建子集合并引发这些问题,只需将所有字段保留在顶级文档(用户文档)中,允许用户更新任何字段。

    match /users/{userId} {
      allow update, read: if true;
      allow create, remove: if false;
    }
    

    但是制作一个(onUpdate)云函数来监听用户文档更新和 检测不允许用户修改的字段的变化,所以 如果用户尝试更改这些字段,我可以检测到这一点并将修改后的字段返回到他们以前的值,如下所示:

    export const updateUser = functions.firestore
        .document('users/{userId}')
        .onUpdate((change, context) => {
            const previousValue = change.before.data().securedField;
            const newValue = change.after.data().securedField;
    
            if (previousValue !== newValue) {
                return db.collection('users')
                    .doc(context.params.userId)
                    .update({ securedField: previousValue });
            }
        });
    

第二种解决方案安全吗?哪个是最好的解决方案?或任何其他解决方案?

【问题讨论】:

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


    【解决方案1】:

    您的方法绝对是一种可能性,并且是对 Cloud Functions 的有趣使用。但是从用户的写入操作到 Cloud Function 检测到并恢复更改之间会有延迟。

    我可能会在安全规则中发现这种情况。虽然您不能拒绝用户在安全规则中写入字段,但您可以确保他们只能将相同的值写入当前具有的字段。这实际上也使他们无法更改字段的值。你这样做:

    allow write: if request.resource.data.securedField == resource.data.securedField;
    

    此规则确保更新文档中的字段 (request.resource.data.securedField) 与当前文档中的字段 (resource.data.securedField) 具有相同的值。

    【讨论】:

    • 非常感谢!这对我有用,你真的帮了我很多,实际上我以前在 firebase 文档中读过这个,但我没想到它会在这里使用。
    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2018-05-24
    • 2018-09-04
    • 2021-05-06
    相关资源
    最近更新 更多