我遇到了 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.
你能帮我理解我做错了什么以及为什么基于函数的方法不起作用吗?
重构安全规则并移动函数声明解决了问题(我的角度客户端被授予了读取权限)。
更改是在此行之后声明函数:
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);
}
}
}
这可能是我在文档或其他内容中错过的某种范围。