Firestore 安全规则 contains() 可以内联规则工作,但不能在函数中工作

问题描述 投票:0回答:1

我遇到了 Firestore 安全规则问题。我有两个版本的规则来检查文档是否存在,但只有其中一个有效。

内联版本工作正常:

match /orgs/{org} {
  allow get: if exists(/databases/$(database)/documents/rbac/$(org)/users/$(request.auth.uid));
}

但是,当我将相同的逻辑移至函数中并最终得到以下安全规则时:

rules_version = '2';
service cloud.firestore {

  function isUser(uid) {
    return request.auth.uid == uid;
  }
  
  function isOrgAdmin(org) {
    return exists(/databases/$(database)/documents/rbac/$(org)/admins/$(request.auth.uid));
  }

  match /databases/{database}/documents {

    match /users/{uid} {
      allow get: if isUser(uid);
    }

    match /orgs/{org} {
      allow get: if isOrgAdmin(org);
    }
  }
}

从我的 Angular fireAngular 读取失败:

Error getting document: orgs/18237018238blahblahblah FirebaseError: Missing or insufficient permissions.

你能帮我理解我做错了什么以及为什么基于函数的方法不起作用吗?

firebase google-cloud-firestore firebase-security
1个回答
0
投票

重构安全规则并移动函数声明解决了问题(我的角度客户端被授予了读取权限)。

更改是在此行之后声明函数:

  match /databases/{database}/documents {

工作安全规则:

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {

  function isUser(uid) {
    return request.auth.uid == uid;
  }
  
  function isOrgAdmin(org) {
    return exists(/databases/$(database)/documents/rbac/$(org)/admins/$(request.auth.uid));
  }


    match /users/{uid} {
      allow get: if isUser(uid);
    }

    match /orgs/{org} {
      allow get: if isOrgAdmin(org);
    }
  }
}

这可能是我在文档或其他内容中错过的某种范围。

© www.soinside.com 2019 - 2024. All rights reserved.