我有一个名为"客户"的集合,我已允许某些用户对该集合的读写权限。我的要求是我必须一次只能将删除操作限制为一个文档,以避免大量删除集合。如何使用消防店安全规则实现此目的。?现在我已经尝试了以下代码
match /customers/{customer=**} {
function isSignedIn() {
return request.auth != null;
}
function isRole(roles) {
return get(/databases/$(database)/documents/Teachers/$(request.auth.uid)).data.permissions.pages.hasAny(roles);
}
function isSize(size){
return request.resource.data.size()==size;
}
allow read: if isSignedIn()&&isRole(['create','modify']);
allow create,update:if isSignedIn()&&isRole(['create','modify']);;
allow delete:if isSignedIn()&&isSize(1)
}
这是删除操作的代码;
async(id:string){
const batch=afs.firestore.batch();
const coll=await afs.firestore.collection('customers').ref.limit(1).where('id','==',id).get();
for(const i of coll.docs){
const ref= await afs.firestore.collection('customers').doc(i.id);
await batch.delete(ref);
}
return await batch.commit();
}
但是上面的规则在进行删除操作时始终返回拒绝的权限。
目前这是不可能的。 Firebase 安全规则不提供任何方法来限制任何操作的速率或数量。 也无法检测当前操作是否是批处理或事务的一部分。
即使有办法检测是否存在批处理操作,用户仍然可以重复调用delete()
以达到相同的效果。
相反,您可以尝试通过 Cloud Functions 发送客户端请求,它可以尝试记录删除文档的请求,并在请求超过您定义的某个限制时拒绝该请求。 这些文档必须完全无法写入安全规则,同时您在 Cloud Functions 中使用的管理员或服务器 SDK 仍然可以访问它们。