【问题标题】:How can i restrict to delete only one document at a time in firestore using security Rule?如何使用安全规则限制在 Firestore 中一次只删除一个文档?
【发布时间】:2019-05-30 11:39:04
【问题描述】:

我有一个名为“客户”的集合,并且我已向某些用户授予对该集合的读写权限。我的要求是我必须一次将删除操作限制为一个文档,以避免大规模删除收藏。如何使用 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();

}

但上述规则在进行删除操作时总是返回权限被拒绝。

【问题讨论】:

  • 您能否编辑问题以显示您试图阻止的“批量删除”操作的示例?
  • 批量删除的场景比较少,但是这里要防止意外批量删除;
  • 再一次,您要阻止的具体查询是什么?
  • 请注意,batch.dalete(i.ref); 不是有效的 API 调用。如果您共享的代码是您实际尝试使用的代码,那真的很有帮助。

标签: javascript google-cloud-firestore angular6 firebase-security


【解决方案1】:

目前这是不可能的。 Firebase 安全规则不提供任何方式来限制任何操作的速率或数量。也无法检测当前操作是批处理还是事务的一部分。

即使有办法检测是否有批处理操作,用户仍然可以反复调用delete()达到同样的效果。

相反,您可以尝试通过 Cloud Functions 发送客户端请求,它可以尝试记录删除文档的请求,并在超出您定义的某个限制时拒绝该请求。这些文档必须完全不能被安全规则写入,而您在 Cloud Functions 中使用的 Admin 或服务器 SDK 仍然可以访问它们。

【讨论】:

  • 安全规则中使用limit操作符限制查询怎么样?
  • 该限制是指在查询中读取的文档数。它与访问文档的速率无关。您将无法实现任何这样的速率控制。
  • 我编辑了这个问题,建议您可以使用 Cloud Functions 来实现自己的速率控制。您将不得不为此编写一堆代码。仅靠安全规则无法完成您尝试做的事情。
  • 感谢您提供宝贵的信息@Doug Stevenson
猜你喜欢
  • 2018-04-22
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2020-06-19
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多