共享内容的 Firebase Firestore 规则

问题描述 投票:0回答:1

我正在开发一个可以上传照片的简单应用程序。我正在使用 firebase firestore 和 storage。每次我上传新照片时,我都会创建一个像这样的对象:

struct Item: Codable, Identifiable {
    var id: UUID // photo name
    var uidOwner: String // uid user owner
    var emailOwner: String // email user owner
    var path: String // photo path
    var shared: [String] = []
}

目前我只是使用此规则来检查用户电子邮件是否包含在每个文档的“共享”数据中。

enter rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /photos/{photo} {
    allow read if: resource.data.emailOwner in get(/databases/$(database)/documents/photos/$(photo)).data.shared;
}}}

在 Swift 项目中我接受这个查询:

enter func getItems() async throws -> [Item] {
    do {
        let querySnapshot = try await photoCollection
            .whereField("emailOwner", arrayContains: user.email ?? "[email protected]")
            .getDocuments()
        let items = try querySnapshot.documents.compactMap { doc in
            return try doc.data(as: Item.self)
        }
        return items
    } catch {
        throw error
    }
}

我正在使用文档共享数组中包含的电子邮件登录。为什么该用户没有访问权限?

swift firebase google-cloud-firestore firebase-security
1个回答
0
投票

如果我没读错的话,你根本不会得到

get(/databases/$(database)/documents/photos/$(photo))
,因为你只是加载正在考虑的文档 - 这可能就是为什么
list
/
getDocuments
调用失败:Firestore 没有办法考虑所有可能的文件。

但是由于您只是使用正在考虑的文档,因此您可以使用:

allow read if: resource.data.emailOwner in resource.data.shared;

规则引擎可能能够静态地评估这一点,这将允许

list
/
getDocuments
调用起作用。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.