无法让 Firestore 规则 get() 在函数内工作

Gal*_*cha 11 firebase firebase-security google-cloud-firestore

Firestore 不能很好地进入函数

\n\n

我有这个规则

\n\n
service cloud.firestore {\n  match /databases/{database}/documents {\n\n    function isProjectOpenForAssign() {\n      return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;\n    }\n\n    match /projects/{anyProject} {\n      allow create: if request.auth != null;\n\n      match /tasks/{anyTask} {\n        allow create: if request.auth != null && (isProjectOpenForAssign());\n      }\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当运行模拟器测试它时我得到:

\n\n
\n

运行模拟时出错 \xe2\x80\x94 错误:simulator.rules 行 [23],列 [14]。函数未找到错误:名称:[get].;错误:提供的调用参数无效。函数:[get],参数:["||invalid_argument||"]

\n
\n

Fra*_*len 6

问题出在您定义函数的范围内。由于您isProjectOpenForAssign在与此 match 相同的级别上定义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));
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在声明 的 match 中定义函数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());
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)