我正在努力访问Firestore规则中的文档引用。我的数据库看起来像这样。 (为简便起见,已简化):
curriculum
session1
roles
admin
--- canEditContent
user
--- canEditContent
users
userid
--- role
roles/admin <document reference>
我想根据文档参考访问管理员权限。
我尝试了几种方法,但似乎无济于事。到目前为止,这是我的代码
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
function getUser() {
return get(/databases/$(database)/documents/users/$(request.auth.uid));
}
function getUserRole() {
let role = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role;
return get(role);
}
match /curriculum/{curriculum} {
allow write: if isSignedIn() && getUserRole().data.canEditContent;
}
match /users/{userId} {
allow read, update, delete, write: if request.auth != null && request.auth.uid == userId;
allow create: if request.auth != null;
}
}
}
我尝试了很多方法,但似乎无法解决。
预先感谢
编辑
在集合下方添加了屏幕截图
答案 0 :(得分:1)
我可以在您的规则中看到两个问题:
get
需要完整的文档路径,因此您的功能getUserRole
无法正常工作。尝试以下方法:
function getUserRole() {
let role = getUser().data.role;
return get(path("/databases/" + database + "/documents/" + role));
}
您的规则使用角色canEditContent
,但是您显示的数据使用editContent
,是故意的吗?
如前所述,请提供完整的数据,查询和规则集,在这里我们看不到您正在使用的查询。另外请注意,您可以使用Firestore模拟器获取有关失败规则和失败规则的信息。