如何使用安全规则限制在Firestore中一次只能删除一个文档



我有一个名为"客户"的集合,我已允许某些用户对该集合的读写权限。我的要求是我必须一次只能将删除操作限制为一个文档,以避免大量删除集合。如何使用消防店安全规则实现此目的。?现在我已经尝试了以下代码

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 仍然可以访问它们。

最新更新