Firestore 安全规则:不违反这些规则的(最小)代码

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

我正在努力设置 Firestore 安全规则,但我面临一个问题,即我的自定义函数 getUserOrganization() 在匹配条件中使用时似乎无法返回正确的值。具体来说,该函数应该返回经过身份验证的用户的组织 ID,但匹配条件似乎没有按预期工作。

  • 我有以下安全规则来根据用户的组织限制对组织集合中文档的访问:
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
  
    match /Users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
    
    match /Organisations/{orgId} {
      allow read, write: if request.auth != null && getUserOrganization() == orgId;
      
      match /{subcollection=**}/{docId} {
        allow read, write: if request.auth != null && getUserOrganization() == orgId;
      }
    }
  }

  // Function to get the user's organization from their document
  function getUserOrganization() {
    return get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.organisation.id;
  }
}

问题

当我尝试使用规则访问组织文档时:

allow read, write: if request.auth != null && getUserOrganization() == orgId;

它会抛出权限错误。但是,如果我像这样对组织 ID 进行硬编码:

allow read, write: if request.auth != null && "Sjc7mG12B0LPPe5bcJOf" == orgId;

规则按预期工作,并且授予访问权限。

这让我相信 getUserOrganization() 函数可能不会返回正确的值,或者可能会返回不同格式的值(例如,不同的数据类型、字符串编码等)。

我尝试过的:

  • 验证用户文档中的组织 ID 设置正确并且与组织文档 ID 匹配。
  • 确认
    getUserOrganization()
    函数正确地从用户文档中获取组织 ID。

附加信息:

  • getUserOrganization() 函数应该从 Users 集合中的用户文档返回组织 ID。
  • Users 文档中的 Organizations.id 字段是一个字符串,它与 Organizations 集合中文档的 ID 匹配。

任何有关如何解决此问题的见解或建议将不胜感激。

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

根据我的理解或根据我过去使用 Firebase 安全规则的经验,我认为它们不应该返回除

boolean
值以外的任何内容。

那么,你可以尝试这样做吗:

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
  
    match /Users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
    
    match /Organisations/{orgId} {
      allow read, write: if request.auth != null && getUserOrganization(orgId);
      
      match /{subcollection=**}/{docId} {
        allow read, write: if request.auth != null && getUserOrganization(orgId);
      }
    }
  }

  // Function to get the user's organization from their document
  function getUserOrganization(orgId) {
    return get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.organisation.id == orgId;
  }
}

在此,您直接将

orgId
作为参数传递,在函数内比较它并返回结果布尔值。

让我知道这是否有效:)

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