14

对于 Firebase 实时数据库的安全规则,公共数据和私有数据可以使用如下规则存在于同一棵树中。

但是,在使用 Firestore 时,我们似乎无法做到这一点,因为我们可以检索的数据只是在 collection 或 document 下。当公共数据和私有数据在同一个文档中定义并使用集合/文档获取数据时,如果我们不是所有者,我们会收到私有数据权限不足的错误。

使用 RTDB 时,我们可以获取 'users/{userId}/publicInfo' 的数据,因为我们对集合/文档一无所知。

有什么办法可以用 Firestore 做到这一点?否则,我们应该分别进行公共/私人收藏吗?

// rule of Firebase Realtime Database
"users": {
   "$user_id": {
       ".read": "auth.uid === $user_id",
       ".write": "auth.uid === $user_id",

       "private": {
          ".read": "auth.uid === $user_id"   // --- private data
       }

       "public": {
          ".read": "auth !== null";           // --- public data 
       }
   }
}

// Firestore
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {

      match /{private=**} {
        allow read, write: if request.auth == userId;
      }

      match /{public=**} {
        allow read, write: if request.auth != null;
      }
    }
  }
}
4

2 回答 2

23

因此,您不能为文档的单独部分设置单独的安全规则。您可以阅读整个文档,也可以不阅读。

也就是说,如果您想为您的 userID 文档提供一个“公共”和“私有”子集合,其中包含公共和私有文档,那么您完全可以这样做,而不是按照您当前设置安全规则的方式.

您所写的那位match /{private=**}并不意味着“匹配任何称为'私人'的子集合”。这意味着,“无论如何匹配任何子集合,然后将其分配给一个名为private”的变量。文档的“使用通配符递归匹配”部分更详细地介绍了这一点。

此外,您需要参考request.auth.uid以获取用户的 ID。

所以,你可能想要更像这样的东西:

// Firestore
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      // You'll probably want to add security rules around the user document 
      // itself. For now, though, let's look at our subcollections:

      match /private/{anything=**} {
        // Only the user can read documents in their private collection
        allow read, write: if request.auth.uid == userId;
      }

      match /public/{anything=**} {
        // Anybody can read documents here, as long as they're signed in
        allow read, write: if request.auth != null;
      }
    }
  }
}
于 2017-10-05T16:46:16.487 回答
0

您可以添加一个visibility属性:public/private作为每个文档的值,并确保您有一个userid字符串或数组(用于多用户访问)

然后您可以编写安全规则来检查属性visibilityuserid.

检查 firestore 文档中的示例。

附加功能

  • 这也使它可以使用shared或更多道具进行扩展。
  • 您不必复制索引
  • 更改可见性时无需移动文档
于 2022-01-20T20:04:45.220 回答