无法使Firestore Rules get()在函数内工作

时间:2019-07-04 17:20:41

标签: firebase google-cloud-firestore firebase-security-rules

Firestore无法与函数内的 get 配合使用

我有这个规则

service cloud.firestore {
  match /databases/{database}/documents {

    function isProjectOpenForAssign() {
      return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;
    }

    match /projects/{anyProject} {
      allow create: if request.auth != null;

      match /tasks/{anyTask} {
        allow create: if request.auth != null && (isProjectOpenForAssign());
      }
    }
  }
}

在运行模拟器测试时,我得到:

  

运行模拟时出错-错误:simulator.rules第[23]行,第[14]列。找不到函数错误:名称:[get]。错误:提供了无效的参数来调用。函数:[get],参数:[“ || invalid_argument ||”]

1 个答案:

答案 0 :(得分:1)

问题出在定义函数的范围之内。由于您在与此匹配项isProjectOpenForAssign相同的级别上定义了match /projects/{anyProject},因此该函数将无权访问anyProject

有两种解决方案:

  1. anyProject作为参数传递给isProjectOpenForAssign

    function isProjectOpenForAssign(anyProject) {
      return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;
    }
    
    match /projects/{anyProject} {
      allow create: if request.auth != null;
    
      match /tasks/{anyTask} {
        allow create: if request.auth != null && (isProjectOpenForAssign(anyProject));
      }
    }
    
  2. 在声明anyProject的匹配项内定义函数。

    match /projects/{anyProject} {
      function isProjectOpenForAssign() {
        return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;
      }
    
      allow create: if request.auth != null;
    
      match /tasks/{anyTask} {
        allow create: if request.auth != null && (isProjectOpenForAssign());
      }
    }