使用 firestore 创建类似 REST 的安全 API
Creating secure REST-like API with firestore
我想在 firebase 中存储一对多关系 firestore。假设我有一个作者,并且有属于这个作者的书。我可以将它存储在嵌套关系中:
author/
authorId1 : {
books: [{...}, {...}]
}
但我还需要一种列出所有书籍的方法,最好不要遍历每个作者(需要实时数据库的 afaik),所以我想我应该这样做
author/
authorId1 : {
books: [bookId1, bookId2]
}
books/
bookId1: {...}
bookId2: {...}
但出于安全和性能原因,我宁愿不在前端进行过滤。我发现可以写查询:
const bookRef = fireStore.collection('books');
debtorsRef.where('author', '==', authorId).then(...);
这有望消除性能问题,但它并不安全,因为有可能从客户端获取其他作者的书籍。另外,我宁愿将关系存储在作者文档中,而不是相反。
在 restful API 上,例如使用 Django Rest Framework,我会将查询集限制为 return 仅属于给定用户的书籍。 IIUC IAM 是可能的,但根据示例我不太确定如何。
再说一次,我想 return 仅当其 ID 在作者的书籍 属性 中列出时。一本书理论上可以属于多个作者。
我想这是重复的,很多人都有这个顾虑,但我找不到这个特定用例的明确答案。
您可以编写 Security Rules 来正确保护您的查询:
service cloud.firestore {
match /databases/{database}/documents {
match /books/{bookId} {
allow read: if request.resource.data.author == resource.data.author
}
}
}
请注意,目前我们仅支持对等式 (==
) 的约束,不支持不等式 (!=
、<
、<=
等)
您可以扩展此概念以在每本书的子集合中维护所有者列表,并进行存在性检查(使用 exists()
函数):
service cloud.firestore {
match /databases/{database}/documents {
match /books/{bookId} {
allow read: if exists(/databases/$(database)/documents/books/$(bookId)/owners/$(request.auth.uid))
match /owners/{ownerId} {
// Include other conditions that provide for ownership checks
allow write: if request.auth.uid == ownerId;
}
}
}
}
我想在 firebase 中存储一对多关系 firestore。假设我有一个作者,并且有属于这个作者的书。我可以将它存储在嵌套关系中:
author/
authorId1 : {
books: [{...}, {...}]
}
但我还需要一种列出所有书籍的方法,最好不要遍历每个作者(需要实时数据库的 afaik),所以我想我应该这样做
author/
authorId1 : {
books: [bookId1, bookId2]
}
books/
bookId1: {...}
bookId2: {...}
但出于安全和性能原因,我宁愿不在前端进行过滤。我发现可以写查询:
const bookRef = fireStore.collection('books');
debtorsRef.where('author', '==', authorId).then(...);
这有望消除性能问题,但它并不安全,因为有可能从客户端获取其他作者的书籍。另外,我宁愿将关系存储在作者文档中,而不是相反。
在 restful API 上,例如使用 Django Rest Framework,我会将查询集限制为 return 仅属于给定用户的书籍。 IIUC IAM 是可能的,但根据示例我不太确定如何。
再说一次,我想 return 仅当其 ID 在作者的书籍 属性 中列出时。一本书理论上可以属于多个作者。
我想这是重复的,很多人都有这个顾虑,但我找不到这个特定用例的明确答案。
您可以编写 Security Rules 来正确保护您的查询:
service cloud.firestore {
match /databases/{database}/documents {
match /books/{bookId} {
allow read: if request.resource.data.author == resource.data.author
}
}
}
请注意,目前我们仅支持对等式 (==
) 的约束,不支持不等式 (!=
、<
、<=
等)
您可以扩展此概念以在每本书的子集合中维护所有者列表,并进行存在性检查(使用 exists()
函数):
service cloud.firestore {
match /databases/{database}/documents {
match /books/{bookId} {
allow read: if exists(/databases/$(database)/documents/books/$(bookId)/owners/$(request.auth.uid))
match /owners/{ownerId} {
// Include other conditions that provide for ownership checks
allow write: if request.auth.uid == ownerId;
}
}
}
}