【问题标题】:How to secure an array for user access in firebase firestore?如何保护阵列以供 Firebase Firestore 中的用户访问?
【发布时间】:2021-10-17 21:15:27
【问题描述】:

在我的 Angular Firebase 应用程序中,许多用户可以登录并编辑一个相同的数据。例如,假设他们正在编辑特定主题的文档。每天都会生成一个新的 Report 对象,它继承了不同的主题和文档。我的数据结构如下:

export interface Report {
    date: Date;
    day: string;
    topics: Topic[];
}

export interface Topic {
    name: string;
    documentations: Documentation[];
}

export interface Documentation {
    userId: string;
    userName: string;
    documentation: string;
}

我想将报表存储为一个没有子集合的对象,这样我就可以一次加载所有数据,而无需向 API 发出大量读取请求。此外,我的用户被分成几组,因此每个主题最多只有 4 个文档,大约 6 到 10 个主题。

因此,每个用户都可以阅读其他用户的文档,但只能编辑自己的文档。 据我所知,无法通过 Firestore 安全规则保护对阵列的访问,所以我唯一的可能就是使用用户云功能来保护我的数据。但我不知道,这是否是最有效的方式,或者不同的数据结构是否更适合我的情况。 因此,如果我是对的并且我必须使用云功能,我该如何检查用户是否只编辑了他的文档而所有其他文档都未编辑?还是我应该尝试不同的方法?

【问题讨论】:

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


    【解决方案1】:

    如果每个用户都可以编写自己的文档,那么正确的数据模型不是数组,而是作者的 UID 到他们编写的文档的映射:

    documentations: Map<String, Documentation>;
    

    由于您现在知道每个用户可以修改的数据的密钥,这也让您更接近于保护它。我只是认为您可能仍然会卡住,因为我不确定您是否可以编写涵盖“所有用户”的规则。


    如果您确实将用户特定的数据放在文档的子集合中,这样的数据结构问题通常更容易解决。

    这可能是我对其建模的方式,然后使用云函数将子集合中的数据聚合回父文档,以仍然满足您只需要读取单个文档的要求获取所有用户的贡献。

    尽管如此,我仍然会使用我上面提到的模型,因为这样可以确保您可以通过单个(幂等)写入来执行聚合,而不必先读取父文档来检查用户是否已经贡献了它。

    【讨论】:

    • 感谢您的回答,它确实帮助了我,但它又提出了一个问题。在我的报告中存储了一些额外的数据,用户应该可以编辑这些数据(reportName 等)。但是,他们应该无法编辑保存在我的报告中的趋势。有没有办法通过安全功能来实现这一点,还是我必须创建一个云功能?
    • 这听起来像是可以通过规则来保护的东西,但如果没有具体细节就很难确定。我建议不要询问用例,而是尝试根据之前提出的文档和问题来实现它,如果遇到困难,请回复MCVE。这让我们更有机会有效地提供帮助。
    【解决方案2】:

    如果您使用的是云功能,那么您可以简单地读取该文档,检查该数组,比较用户 UID 并检查用户是否仅在编辑他们的文档,然后更新整个文档。

    exports.addMessage = functions.https.onCall((data, context) => {
      const {uid} = context.auth
      const {updates, documentationId, reportId} = data
    
      // 1. Fetch document using reportId
      // 2. Read the documentations array
      // 3. Check if doc with that ID exists and if caller owns it
      // 4. If yes, update else return 403 - forbidden error 
    });
    

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多