有一个应用程序,其中我们有多个communities
和一个用户,它们具有向write
发送消息的角色。
每个社区都有自己的用户({communityId}/meta_users/{uid}
),我编写了一个函数来访问用户的角色,我试图浏览该文档,但无法提供任何帮助。
模拟我检查了userRoleLevel
是否允许读取,即使用户已分配了一个角色('admin')。
请帮助我纠正它。我粘贴了以下规则的代码段。让我知道是否需要更多信息
function userRoleLevel(community){
return exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level)
&& get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
}
service cloud.firestore {
match /databases/{database}/documents {
// All read is allowed for now.
match /{document=**} {
allow read;
}
match /communities/{community} {
allow write: if owner();
match /{category}/{message}{
allow write: if loggedIn()
&& (userRoleLevel(community) in ['owner', 'admin', 'writer']);
}
答案 0 :(得分:0)
您具有函数userRoleLevel()
,该函数返回布尔值而不是包含角色的字符串。除非您执行以下操作,否则将无法使用userRoleLevel(community) in ['owner', 'admin', 'writer']
。
function userRoleLevel(community){
if( exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level) ) {
return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
} else {
return false; // return something that won't match your roles
}
}
答案 1 :(得分:0)
最后,我找到了解决此问题的方法。 事物是函数的位置,它在数据库架构的范围之外,并且它使用段变量作为数据库范围。
解决方案是在数据库架构内移动此功能。
service cloud.firestore {
match /databases/{database}/documents {
// All read is allowed for now.
match /{document=**} {
allow read;
}
// function should be located here <--------
function userRoleLevel(community){
return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
}
...
}
希望,这对其他人也有帮助。