首页 > 解决方案 > 用户读取自己的个人资料数据时如何为读取操作设置 Firebase 安全规则

问题描述

我正在开发一个 Flutter 应用程序并使用 Firebase 作为后端。在我的应用程序中,每个用户都需要注册才能使用该应用程序,并且用户的个人资料数据保存在一个user_profile集合中。

每个用户的配置文件数据都存储在集合中的单独文档中。每个文档的文档 ID 等于用户 ID,由 Firebase 身份验证在用户首次注册时创建。我还将用户 ID 保存在每个文档的一个字段(名为 uid)中,以及相应的用户。

对于安全部分,我希望每个用户只能阅读他/她自己的个人资料数据。我设置了以下规则:

// Rules for User Profile data
match /user_profile/{any} {
  allow read: if (request.auth != null) && 
                 (resource.data.uid == request.auth.uid) && 
                 exists(/databases/$(database)/documents/users/$(request.auth.uid));

如果我按照上面的例子设置我的规则是否正确?(1) 用户需要认证 (2)uid传入请求中的 uid 需要等于用户要阅读的相应文档中的 uid 字段。(3)请求中可用的uid的文档必须存在于对应的文档中

如果我让整个事情变得不必要地复杂,我无法让我清楚。例如,规则 (1) 是否与规则 (2) 做同样的事情?虽然我有规则 (1) 和 (2),但它是否也增加了规则 (3) 的内容?

标签: firebasefluttergoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


基于您问题中的以下要素:

  1. 用户的个人资料数据保存在user_profile集合中
  2. 每个(用户的配置文件)文档的文档 ID 等于用户 ID
  3. 您希望每个用户只能阅读他/她自己的个人资料数据

以下读取安全规则应该可以解决问题:

service cloud.firestore {
  match /databases/{database}/documents {

    // Match any document in the 'user_profile' collection
    match /user_profile/{userId} {
      allow read: if request.auth != null && request.auth.uid == userId;
      // ...
    }
  }
}

换句话说,由于每个(用户的配置文件)文档的文档 ID 等于userId您不需要userId在安全规则中使用包含 的字段:通配符表达式{userId}使userId变量在规则中可用,请参阅doc


推荐阅读