我正在努力设置 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() 函数可能不会返回正确的值,或者可能会返回不同格式的值(例如,不同的数据类型、字符串编码等)。
我尝试过的:
getUserOrganization()
函数正确地从用户文档中获取组织 ID。附加信息:
任何有关如何解决此问题的见解或建议将不胜感激。
根据我的理解或根据我过去使用 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
作为参数传递,在函数内比较它并返回结果布尔值。
让我知道这是否有效:)