我正在开发一个可以上传照片的简单应用程序。我正在使用 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
}
}
我正在使用文档共享数组中包含的电子邮件登录。为什么该用户没有访问权限?
如果我没读错的话,你根本不会得到
get(/databases/$(database)/documents/photos/$(photo))
,因为你只是加载正在考虑的文档 - 这可能就是为什么 list
/getDocuments
调用失败:Firestore 没有办法考虑所有可能的文件。
但是由于您只是使用正在考虑的文档,因此您可以使用:
allow read if: resource.data.emailOwner in resource.data.shared;
规则引擎可能能够静态地评估这一点,这将允许
list
/getDocuments
调用起作用。